TestNG 使用多个 DataProvider 和单个测试方法

2023-11-23

我一直在寻找一种在我的测试方法中使用多个 DataProvider 的方法。我的场景如下:

假设我们有一个 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 }
        };
    }
}

现在,在我的测试方法中,我想针对所有场景组合运行:

  1. 绿色广场
  2. 红方格
  3. 绿色三角形
  4. 红三角

鉴于我可以指定多个数据提供者,我应该如何在我的代码中实现这一点@Test注解

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

编辑:我发现了类似的问题和@解决方法但我仍然想知道是否有更好的方法来处理这个问题。


由于缺乏更好的方法,我决定坚持使用解决方法。以下是如何实现上述场景的示例:

@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;
    }
}

这样我就可以分别使用我的颜色代码和形状代码,并且还允许我使用组合。

所以,我的测试方法如下:

@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 */
        .............
    }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

TestNG 使用多个 DataProvider 和单个测试方法 的相关文章

随机推荐

  • 角度拦截器和 CORS

    我正在尝试编写一个拦截器 以使用 Angular 向所有 HTTP 请求添加令牌 我大致使用这里给出的食谱 https thinkster io interceptors 所以代码使用 http 模块工厂和tokenInterceptor
  • 使用 UNION 时,SQL 查询是否保证以原子方式执行?

    我正在发出一个由使用 UNION 分组的多个 SELECT 组成的单个 SQL 查询 SELECT FROM employee LEFT JOIN department ON employee DepartmentID department
  • 是否可以在 Visual Studio 调试会话之间保留 Cookie

    我有一个身份验证 cookie 当我在本地环境中点击登录屏幕后 该 cookie 就会被设置 该 cookie 已被设置为持久性的 并被赋予未来 7 天的超时期限 当我结束调试会话并在另一个构建后开始调试时 cookie 不存在 每个浏览器
  • jquery 获取加载时 iframe 内容的高度

    我有一个帮助页面 help php 我正在 main php 的 iframe 中加载该页面 在 iframe 中加载此页面后 如何获取该页面的高度 我问这个是因为我无法将 iframe 的高度设置为 100 或自动 这就是为什么我认为我需
  • C++ 中的除法[重复]

    这个问题在这里已经有答案了 我是 C 新手 我尝试了这个简单的代码 include
  • 如何将数组作为参数传递给 vararg 函数?

    我有一些代码看起来像这样 uint8 t activities 8 uint8 t numActivities 0 activities numActivities someValue activities numActivities so
  • 将 Dropbox 集成到 Android 应用程序中,但没有登录弹出窗口

    我想在我的应用程序中使用保管箱 我开发了一个用于上传和下载文件的示例应用程序 它要求身份验证 但我不想打开登录弹出窗口 其他用户是否可以使用默认帐户 单个帐户 登录详细信息访问保管箱 因此任何用户都可以直接使用 dropbox 而无需弹出登
  • 可以在 Visual Studio 中使用 WSDL 自动生成代码

    您好 我想使用测试以下功能 http msrmaps com terraservice2 asmx op ConvertLonLatPtToNearestPlace 是否有一些更快的方法可以使用 Visual Studio 2010 对其进
  • 部分匹配行名时发出警告

    我刚刚发现了数据框中行名称部分匹配导致的错误 有没有办法禁用部分匹配 运算符或在使用全局匹配时生成警告 我知道这是可能的exact TRUE为了 运算符或与options warnPartialMatchDollar TRUE for 索引
  • 派生类的指针可以类型转换为其基类的指针吗?

    new 返回的派生类的指针可以进行 类型转换为其基类的指针 这是对还是错 我知道dynamic cast可以用来消除缺点 一般来说 如何将派生类的指针转换为其基类的指针 是的 从指向派生类的指针到指向基类的指针的转换是隐式的 因此 以下内容
  • JUnit - 如何测试具有不同值的方法?

    我有一个方法并希望用不同的值来测试它 我的问题是 如何编写 JUnit 测试来测试具有不同值的相同方法 您可以查看参数化测试 例如example 你也可以使用理论这在很多情况下更方便
  • Android 中使用 Kotlin 的 HTTP 请求

    我想使用 POST 方法进行登录验证并使用 GET 方法获取一些信息 我已经有了我之前项目的 URL 服务器用户名和密码 对于安卓系统 Volley是一个很好的起点 对于所有平台 您可能还想查看ktor客户或http4k这都是很好的图书馆
  • React Admin 显示非常混乱

    我的 RA 项目在本地部署时渲染良好 但是 当我将构建目录复制到 S3 存储桶进行部署时 它渲染得一团糟 有时它会起作用 但大多数时候它会呈现如下图所示 它在使用 AOR 的两种环境中都可以正常工作 环境 React admin版本 2 0
  • 使用 JavaScript 更改浏览器中的 URL,而不加载新页面

    我怎样才能有一个JavaScript可能会对当前页面产生一些影响 但也会更改浏览器中的 URL 的操作 因此如果用户点击重新加载或添加书签 则会使用新的 URL 如果后退按钮能够重新加载原始 URL 那就太好了 我正在尝试在 URL 中记录
  • Pylint 忽略特定名称[重复]

    这个问题在这里已经有答案了 我有 pylint 问题 即有时它会对某些变量 类 模块等重复相同的消息 但我找不到解决方法 我想说的是 pylint 不要使用某些选项或 rcfile 指令检查 此模块 模块 ZZZ 中的 消息 XXX 任何消
  • 有关如何将 SwipeRefreshLayout 与 ListView 结合使用的简单示例

    有人有关于如何将 SwipeRefreshLayout 与 ListView 一起使用的简单示例吗 这是我的情况 我有一个类 SynchDogs 从服务器提取数据 所以该类作为我的适配器的源 我想使用 SwipeRefreshLayout
  • -viewDidLoad 未在子类 UIViewController 中调用

    请耐心等待 我还在学习 Cocoa Touch 其他 viewDidLoad 未被调用问题与我的问题无关 我进行了搜索 I have FooViewController a UIViewController子类 FooViewControl
  • Web API 和 MVC 异常处理

    我们目前正在将 Web 表单系统重新开发为 Web API 和 MVC 这对我们来说是新技术 到目前为止 一切似乎都很好 但是我们正在努力将错误从 Web API 应用程序发送回 MVC 应用程序 我们意识到我们需要捕获任何异常并将这些异常
  • 在 pandas DataFrame/Series 中快速选择时间间隔

    我的问题是我想过滤 DataFrame 以仅包含间隔内的时间 开始 结束 如果不关心这一天 我只想过滤每天的开始和结束时间 我有一个解决方案 但速度很慢 所以我的问题是是否有一种更快的方法来进行基于时间的过滤 Example import
  • TestNG 使用多个 DataProvider 和单个测试方法

    我一直在寻找一种在我的测试方法中使用多个 DataProvider 的方法 我的场景如下 假设我们有一个 DataProvider 类 Test public class ExampleDataProvider Returns the li