2011-12-14 15 views

Respuesta

17

No hay ninguna combinación lista para usar de pruebas con parámetros de tipo y pruebas con parámetros de valores. Los desarrolladores googletest han sido asked the question and they said No.

Sin embargo, hay una manera rutinaria y sencilla (como lo sugiere Zhanyong Wan en la discusión ligada) en el que puedes crear es el propietario caso de prueba de tipo parametrizado que pone a prueba alguna condición para un determinado rango de valores del tipo de parámetro. He aquí un ejemplo elemental donde la condición es sólo es mayor que 0:

#include <vector> 
#include "gtest/gtest.h" 

template<class T> 
struct foo_test : public ::testing::Test { 
    static std::vector<T> _range_; 
}; 

TYPED_TEST_CASE_P(foo_test); 

TYPED_TEST_P(foo_test, IsGreaterThanZero) { 
    for (TypeParam value : foo_test<TypeParam>::_range_) { 
     EXPECT_GT(value,0); 
    } 
} 

REGISTER_TYPED_TEST_CASE_P(foo_test,IsGreaterThanZero); 

typedef ::testing::Types<char, int, float> MyTypes; 
INSTANTIATE_TYPED_TEST_CASE_P(My, foo_test, MyTypes); 

template<> std::vector<char> foo_test<char>::_range_{'1','2','3'}; 
template<> std::vector<int> foo_test<int>::_range_{1,2,3}; 
template<> std::vector<float> foo_test<float>::_range_{1.1,2.2,0.0}; 

int main(int argc, char **argv) { 
    ::testing::InitGoogleTest(&argc, argv); 
    return RUN_ALL_TESTS(); 
} 

Cuando se compila y ejecuta la salida de ese es:

[==========] Running 3 tests from 3 test cases. 
[----------] Global test environment set-up. 
[----------] 1 test from My/foo_test/0, where TypeParam = char 
[ RUN  ] My/foo_test/0.IsGreaterThanZero 
[  OK ] My/foo_test/0.IsGreaterThanZero (0 ms) 
[----------] 1 test from My/foo_test/0 (0 ms total) 

[----------] 1 test from My/foo_test/1, where TypeParam = int 
[ RUN  ] My/foo_test/1.IsGreaterThanZero 
[  OK ] My/foo_test/1.IsGreaterThanZero (0 ms) 
[----------] 1 test from My/foo_test/1 (0 ms total) 

[----------] 1 test from My/foo_test/2, where TypeParam = float 
[ RUN  ] My/foo_test/2.IsGreaterThanZero 
/home/imk/develop/SO/gtest/main.cpp:14: Failure 
Expected: (value) > (0), actual: 0 vs 0 
[ FAILED ] My/foo_test/2.IsGreaterThanZero, where TypeParam = float (0 ms) 
[----------] 1 test from My/foo_test/2 (1 ms total) 

[----------] Global test environment tear-down 
[==========] 3 tests from 3 test cases ran. (1 ms total) 
[ PASSED ] 2 tests. 
[ FAILED ] 1 test, listed below: 
[ FAILED ] My/foo_test/2.IsGreaterThanZero, where TypeParam = float 

1 FAILED TEST 

Los resultados tienen una granularidad más gruesa de lo que sería ideal: solo 3 pruebas en lugar de que 9. Aún así, los valores que fallan pueden ser informados, como se muestra, por lo que el grano grueso bien puede ser tolerable.

+0

¿Alguna idea de cómo obtener un producto cartesiano de los parámetros tipo/valor sin codificarlo? – memecs

+0

Para ser bastante claro, quiere probar cada uno de los tipos 'T0, .., Tn' para cada uno de los conjuntos de valores' V0, .., Vm', de modo que un 'Ti' sea construible a partir de' Vj' para cualquier 'i <= n' y' j <= m'. ¿Está bien? –

+0

Bien, no estoy seguro de lo que quiere decir con "Ti construible de Vj" sin embargo. Le daré un ejemplo para que sea más claro: supongamos que tengo tres tipos {T1, T2, T3} y dos parámetros de valor {V1, V2}, quiero probar contra las siguientes tuplas: {(T1, V1), (T1, V2), (T1, V3), (T2, V1), (T2, V2), etc ...}. El punto es que tengo muchos parámetros y tipos para probar y no puedo codificarlos todos. – memecs

Cuestiones relacionadas