¿Hay alguna manera de configurar mis propios nombres de casos de prueba personalizados cuando uso pruebas parametrizadas en JUnit4?
Me gustaría cambiar el valor predeterminado [Test class].runTest[n]
- a algo significativo.
fuente
¿Hay alguna manera de configurar mis propios nombres de casos de prueba personalizados cuando uso pruebas parametrizadas en JUnit4?
Me gustaría cambiar el valor predeterminado [Test class].runTest[n]
- a algo significativo.
Esta característica lo ha convertido en JUnit 4.11 .
Para usar cambiar el nombre de las pruebas parametrizadas, usted dice:
@Parameters(name="namestring")
namestring
es una cadena, que puede tener los siguientes marcadores de posición especiales:
{index}
- el índice de este conjunto de argumentos. El valor por defecto namestring
es {index}
.{0}
- el primer valor del parámetro de esta invocación de la prueba.{1}
- el segundo valor del parámetroEl nombre final de la prueba será el nombre del método de prueba, seguido de los namestring
paréntesis, como se muestra a continuación.
Por ejemplo (adaptado de la prueba unitaria para la Parameterized
anotación):
@RunWith(Parameterized.class)
static public class FibonacciTest {
@Parameters( name = "{index}: fib({0})={1}" )
public static Iterable<Object[]> data() {
return Arrays.asList(new Object[][] { { 0, 0 }, { 1, 1 }, { 2, 1 },
{ 3, 2 }, { 4, 3 }, { 5, 5 }, { 6, 8 } });
}
private final int fInput;
private final int fExpected;
public FibonacciTest(int input, int expected) {
fInput= input;
fExpected= expected;
}
@Test
public void testFib() {
assertEquals(fExpected, fib(fInput));
}
private int fib(int x) {
// TODO: actually calculate Fibonacci numbers
return 0;
}
}
dará nombres como testFib[1: fib(1)=1]
y testFib[4: fib(4)=3]
. (La testFib
parte del nombre es el nombre del método de @Test
).
{0}
y si{1}
son matrices? IdealmenteArrays.toString({0})
, JUnit debería llamar , no{0}.toString()
. Por ejemplo, midata()
método regresaArrays.asList(new Object[][] {{ new int[] { 1, 3, 2 }, new int[] { 1, 2, 3 } }});
.Mirando JUnit 4.5, su corredor claramente no lo admite, ya que esa lógica está enterrada dentro de una clase privada dentro de la clase Parameterized. No podría usar el corredor parametrizado JUnit, y crear uno propio que comprendería el concepto de nombres (lo que lleva a la pregunta de cómo podría establecer un nombre ...).
Desde una perspectiva JUnit, sería bueno si en lugar de (o además de) simplemente pasar un incremento, pasaran los argumentos delimitados por comas. TestNG hace esto. Si la función es importante para usted, puede comentar en la lista de correo de Yahoo a la que se hace referencia en www.junit.org.
fuente
Recientemente me encontré con el mismo problema al usar JUnit 4.3.1. Implementé una nueva clase que extiende Parameterized llamada LabelledParameterized. Ha sido probado usando JUnit 4.3.1, 4.4 y 4.5. Reconstruye la instancia de Descripción utilizando la representación String del primer argumento de cada matriz de parámetros del método @Parameters. Puede ver el código para esto en:
http://code.google.com/p/migen/source/browse/trunk/java/src/.../LabelledParameterized.java?r=3789
y un ejemplo de su uso en:
http://code.google.com/p/migen/source/browse/trunk/java/src/.../ServerBuilderTest.java?r=3789
¡La descripción de la prueba se forma muy bien en Eclipse, que es lo que quería, ya que esto hace que las pruebas fallidas sean mucho más fáciles de encontrar! Probablemente refinaré y documentaré más las clases en los próximos días / semanas. Suelta el '?' parte de las URL si desea el borde de sangrado. :-)
Para usarlo, todo lo que tiene que hacer es copiar esa clase (GPL v3) y cambiar @RunWith (Parameterized.class) a @RunWith (LabelledParameterized.class) asumiendo que el primer elemento de su lista de parámetros es una etiqueta sensible.
No sé si las versiones posteriores de JUnit abordan este problema, pero incluso si lo hicieran, no puedo actualizar JUnit ya que todos mis co-desarrolladores también tendrían que actualizar y tenemos prioridades más altas que volver a utilizar herramientas. De ahí que el trabajo en la clase sea compilable por múltiples versiones de JUnit.
Nota: hay algo de jiggery-pokery de reflexión para que se ejecute en las diferentes versiones de JUnit que se enumeran anteriormente. La versión específica para JUnit 4.3.1 se puede encontrar aquí y, para JUnit 4.4 y 4.5, aquí .
fuente
execute[0], execute[1] ... execute[n]
en los informes de prueba generados.Con
Parameterized
como modelo, escribí mi propio corredor / suite de prueba personalizado, solo me llevó aproximadamente media hora. Es ligeramente diferente de los de darrenp, yaLabelledParameterized
que le permite especificar un nombre explícitamente en lugar de depender de los primeros parámetrostoString()
.Tampoco usa matrices porque odio las matrices. :)
Y un ejemplo:
fuente
desde junit4.8.2, puede crear su propia clase MyParameterized simplemente copiando la clase Parameterized. cambie los métodos getName () y testName () en TestClassRunnerForParameters.
fuente
También puede probar JUnitParams: http://code.google.com/p/junitparams/
fuente
Puedes crear un método como
Si bien no lo usaría todo el tiempo, sería útil averiguar exactamente qué número de prueba es 143.
fuente
Hago un amplio uso de la importación estática para Assert y amigos, por lo que me resulta fácil redefinir la afirmación:
Por ejemplo, podría agregar un campo "nombre" a su clase de prueba, inicializado en el constructor, y mostrarlo en caso de falla de la prueba. Simplemente páselo como los primeros elementos de su matriz de parámetros para cada prueba. Esto también ayuda a etiquetar los datos:
fuente
Nada de eso funcionaba para mí, así que obtuve la fuente de Parametrizado y lo modifiqué para crear un nuevo corredor de prueba. ¡No tuve que cambiar mucho pero FUNCIONA!
fuente
Una solución alternativa sería capturar y anidar todos los Throwables en un nuevo Throwable con un mensaje personalizado que contenga toda la información sobre los parámetros. El mensaje aparecería en el seguimiento de la pila. Esto funciona cuando falla una prueba para todas las aserciones, errores y excepciones, ya que todas son subclases de Throwable.
Mi código se ve así:
El seguimiento de la pila de la prueba fallida es:
fuente
Eche un vistazo a JUnitParams como se menciona en dsaff, funciona usando ant para construir descripciones de métodos de prueba parametrizados en el informe html.
Esto fue después de probar LabelledParameterized y descubrir que, aunque funciona con eclipse, no funciona con hormiga en lo que respecta al informe html.
Salud,
fuente
Dado que el parámetro al que se accede (por ejemplo, con
"{0}"
siempre devuelve latoString()
representación, una solución alternativa sería realizar una implementación anónima y anulartoString()
en cada caso. Por ejemplo:fuente