Sé cómo desarrollar una prueba parametrizada por tipo y una prueba con parámetro de valor por separado. Lo que intento averiguar es si es posible combinar ambos. En otras palabras, cree una prueba genérica que tome cualquier tipo y rango de valores para ese tipo.Prueba de Google: ¿Hay alguna manera de combinar una prueba que esté parametrizada y parametrizada en valores?
Respuesta
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.
¿Alguna idea de cómo obtener un producto cartesiano de los parámetros tipo/valor sin codificarlo? – memecs
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? –
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
- 1. Pasar un nombre de tipo y una cadena a una prueba parametrizada mediante la prueba de google
- 2. ¿Cómo pruebo las excepciones en una prueba parametrizada?
- 3. ¿Cómo realizo una consulta parametrizada en CouchDB
- 4. Jenkins - activando una compilación parametrizada
- 5. parametrizada con Guice
- 6. Cómo pasar una clase parametrizada como argumento
- 7. ¿Hay alguna manera fácil de combinar dos valores System.Drawing.Color?
- 8. Estilo/plantilla parametrizada en WPF?
- 9. ¿Hay alguna manera de hacer que Eclipse ejecute una prueba JUnit varias veces hasta que falle?
- 10. La forma en que funciona la consulta parametrizada de PDO
- 11. Escribir un reutilizable (parametrizada) Método unittest.TestCase
- 12. python 3: class "template" (función que devuelve una clase parametrizada)
- 13. ¿Por qué la versión parametrizada de esta consulta se ejecuta más despacio que una versión no parametrizada?
- 14. Consulta SPARQL parametrizada con JENA
- 15. Solicitud de obtención parametrizada en Ruby?
- 16. ¿Hay alguna forma de saltear solo una prueba en maven?
- 17. preparado consulta parametrizada con PDO
- 18. MySQL consulta parametrizada utilizando como
- 19. Proguard con orrmlite - Colección parametrizada
- 20. ¿Cómo hace google prueba secuencia de prueba
- 21. ¿Hay alguna manera de saber si hay fallas en mi caso de prueba PHPUnit de tearDown()?
- 22. ¿Hay alguna manera de cambiar el contexto entre Prueba de unidad y Versión. en C#
- 23. ¿Cómo escribir una consulta parametrizada en el estudio de gestión?
- 24. Encontrar la salida de SQL de una consulta parametrizada
- 25. ¿Hay alguna manera de deshabilitar la cobertura de código en PHPUnit para una sola prueba?
- 26. excepción sql, falta la consulta parametrizada
- 27. Marco de prueba de Google - Dependencia entre casos de prueba
- 28. ¿Hay alguna prueba para Ruby on Rails?
- 29. ¿Hay alguna manera de combinar archivos PDF en pdf.js?
- 30. Jenkins: cómo hacer los parámetros necesarios en una compilación parametrizada?
Me preguntaba lo mismo ... – memecs