TestNG using multiple DataProviders with single Test method

前端 未结 3 1646
一向
一向 2020-12-30 11:34

I have been looking for a way to use multiple DataProviders in my test method. My scenario is as follows:

lets say we have a DataProvider class:

@Tes         


        
相关标签:
3条回答
  • 2020-12-30 11:46

    https://stackoverflow.com/a/59993761/5016494

    This may help

        @DataProvider
        public Object[][] combinedDataProvider() {
            return Stream.of(dp1(), dp2())
                    .flatMap(Arrays::stream)
                    .toArray(Object[][]::new);
        }
    
    0 讨论(0)
  • 2020-12-30 11:57

    Great answer Segmented

    Maybe someone will need it too, I rewrote this method in a different way.

    // 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;
    
    0 讨论(0)
  • 2020-12-30 12:02

    For the lack of a better approach, I decided to stick to the workaround. here is an example of how the above scenario could be implemented:

    @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){
                    objectCodesList.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;
        }
    }
    

    This way I get to use my Color codes and Shape codes separately and also provides me to use the combination.

    So, my test methods would look like:

    @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 */
            .............
        }
    
    0 讨论(0)
提交回复
热议问题