tests test parallel after java testing automation testng

java - parallel - TestNG utilizando múltiples DataProviders con un solo método de prueba



testng test (2)

Por la falta de un mejor enfoque, decidí seguir con la solución. aquí hay un ejemplo de cómo se podría implementar el escenario anterior:

@Test public class ExampleDataProvider { /** * Returns the list of shape codes. * * @return the collection shape codes. */ @DataProvider(name = "ShapeCodes") public static Object[][] getShapeCodes() { return new Object[][] { new Object[] { Shape.Square }, new Object[] { Shape.Triangle } }; } /** * Returns the list of color codes. * * @return the collection of color codes. */ @DataProvider(name = "ColorCodes") public static Object[][] geColorCodes() { return new Object[][] { new Object[] { Color.Green }, new Object[] { Color.Red } }; } /** * Returns the list object codes providing a color shape combination. * * @return the collection of object codes. */ @DataProvider(name = "objectCodes") public static Object[][] getObjectCodes(){ return combine(geColorCodes(), getShapeCodes()); } /** * Returns the list of combination of color and shape codes. * * @return the collection of combined color and shape codes. */ public static Object[][] combine(Object[][] a1, Object[][] a2){ List<Object[]> objectCodesList = new LinkedList<Object[]>(); for(Object[] o : a1){ for(Object[] o2 : a2){ cardCodesList.add(concatAll(o, o2)); } } return objectCodesList.toArray(new Object[0][0]); } @SafeVarargs public static <T> T[] concatAll(T[] first, T[]... rest) { //calculate the total length of the final object array after the concat int totalLength = first.length; for (T[] array : rest) { totalLength += array.length; } //copy the first array to result array and then copy each array completely to result T[] result = Arrays.copyOf(first, totalLength); int offset = first.length; for (T[] array : rest) { System.arraycopy(array, 0, result, offset, array.length); offset += array.length; } return result; } }

De esta forma, puedo usar mis códigos de colores y códigos de forma por separado y también me proporciona el uso de la combinación.

Entonces, mis métodos de prueba se verían así:

@Test(dataProvider = "objectCodes", dataProviderClass = ExampleDataProvider.class) public void test(String ShapeCode, String ColorCode) throws IOException { ............. /* tests for color shape combination */ ............. } @Test(dataProvider = "ShapeCodes", dataProviderClass = ExampleDataProvider.class) public void test(String ShapeCode) throws IOException { ............. /* tests for shapes */ ............. } @Test(dataProvider = "ColorCodes", dataProviderClass = ExampleDataProvider.class) public void test(String ColorCode) throws IOException { ............. /* tests for colors */ ............. }

He estado buscando una forma de utilizar múltiples DataProviders en mi método de prueba. Mi escenario es el siguiente:

digamos que tenemos una clase DataProvider:

@Test public class ExampleDataProvider { /** * Returns the list of shape codes. * * @return the collection shape codes. */ @DataProvider(name = "ShapeCodes") public static Object[][] getShapeCodes() { return new Object[][] { new Object[] { Shape.Square }, new Object[] { Shape.Triangle } }; } /** * Returns the list of color codes. * * @return the collection of color codes. */ @DataProvider(name = "ColorCodes") public static Object[][] geColorCodes() { return new Object[][] { new Object[] { Color.Green }, new Object[] { Color.Red } }; } }

Ahora en mi método de prueba quiero ejecutar para todas las combinaciones de escenarios:

  1. Green-Square
  2. Cuadrado rojo
  3. Green-Triangle
  4. Triángulo rojo

¿Cómo debo lograr esto en mi código, dado que no puedo especificar múltiples DataProviders con la anotación @Test

@Test(dataProvider = "ShapeCodes", dataProviderClass = ExampleDataProvider.class) public void test(String ShapeCode, String ColorCode) throws IOException { ............. /* tests for color shape combination */ ............. }

EDIT: encontré un problema similar y una @ solución, pero todavía me pregunto si hay mejores formas de manejar esto.


Gran respuesta segmentada

Tal vez alguien lo necesite también, reescribí este método de una manera diferente.

// public static <T> T[] concatAll(T[] first, T[]... rest) { public static Object[] concat(Object[] first, Object[] second) { Object[] result = ArrayUtils.addAll(first, second); return result;