如何使用Excel中的数据运行条件TestNG测试

时间:2017-11-23 19:44:03

标签: java excel testng data-driven-tests testng-dataprovider

我有一个包含多个@Test方法的类,每个方法都有不同的功能。

class myTests
{
@Test
test1()
{
...............
}

@Test
test2()
{
...............
}
}

遵循数据驱动方法,我在Excel中拥有数据。 excel表中的每一行对应一个不同的测试用例,该测试用例应执行上述类中的测试方法。

以下是excel表中的示例数据,其中包含方法名称作为参数之一(例如:test1,test2),还有一个标志,用于确定是否应在运行时拾取案例以供执行(例如: Y,N)

case1 data1 data2 data3........test1 y
case2 data4 data5 data6........test1 y
case3 data7 data8 data9........test2 y
case4 data10 data11 data12........test1 n  

以下是我的问题:

  1. 如何将案例映射到相应的测试方法
  2. 如何根据标志
  3. 运行特定案例

    我的理解是使用DataProvider注释,测试方法可以使用不同的输入数据运行。但是如果单个类中有多个测试方法,我不确定如何将测试方法与相应的测试数据进行映射。

    此外,我尝试寻找可用于改变测试方法的运行时行为的IAnnotationTransformer,但无法找到将标记数据从excel发送到变换器类的方法。

    提前致谢..

1 个答案:

答案 0 :(得分:0)

如何做到这一点,你可以做些什么,但它需要你身边的很多自定义。 TestNG中没有任何东西可以为您提供开箱即用的这种功能。

IAnnotationTransformer对你没用,因为这个监听器只考虑方法而不知道实例。它也可以在任何运行之前运行,并且没有办法让你可以进行这种迭代。所以这可以排除。

您最好的选择是使用@Factory@DataProvider,其中@Factory将生成 ONLY 您的测试类的一个实例和所有测试方法必须强制性地成为同一测试类的一部分。

以下是这个想法:

  • 在数据源中创建一个附加列,该列表示应基本消耗数据源的类。
  • 构建一个数据提供程序,使其读取上述数据源,过滤掉所有完全限定类名与当前数据提供程序的封闭类匹配的行。
  • 还应构建数据提供程序,以便创建映射(键是测试方法名称,值是用于不同迭代的值列表)。
  • 一旦它拥有所有已过滤的行,它只会创建一行测试数据,以便TestNG只创建一个测试类实例。
  • 让您的测试类也实现IHookable接口,以便您可以决定运行哪种测试方法以及可以跳过哪种测试方法。
  • 现在,如果一个方法满足运行检查,你基本上会让测试方法循环遍历它所拥有的所有测试数据(因此,与数据提供程序设置不同,它总是1个测试方法将在一个循环中运行它的所有数据其中TestNG为您自动执行此操作),并且您使用软断言来断言所有验证。这样,在完成所有迭代后,您的测试将通过/失败。

以下是一个展示其中一些内容的示例。

import org.testng.IHookCallBack;
import org.testng.IHookable;
import org.testng.ITestResult;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Factory;
import org.testng.annotations.Test;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class TestclassSample implements IHookable {

    private List<String> methodsToRun = new ArrayList<>();

    @Factory(dataProvider = "dp")
    public TestclassSample(List<String> methodsToRun) {
        this.methodsToRun = methodsToRun;
    }

    @Override
    public void run(IHookCallBack callBack, ITestResult testResult) {
        String testMethodName = testResult.getMethod().getMethodName();
        if (methodsToRun.contains(testMethodName)) {
            System.err.println("About to run " + testResult.getMethod().getMethodName());
            callBack.runTestMethod(testResult);
        } else {
            testResult.setStatus(ITestResult.SKIP);
        }
    }

    @Test
    public void testMethod() {
        System.err.println("testMethod()");
    }

    @Test
    public void anotherTestMethod() {
        System.err.println("anotherTestMethod()");
    }

    @Test
    public void thirdTestMethod() {
        System.err.println("thirdTestMethod()");
    }

    @DataProvider(name = "dp")
    public static Object[][] getData() {
        return new Object[][]{
                {Arrays.asList("testMethod", "thirdTestMethod")}
        };
    }
}

这是输出:

About to run testMethod
testMethod()
About to run thirdTestMethod
thirdTestMethod()

Test ignored.

===============================================
Default Suite
Total tests run: 3, Failures: 0, Skips: 1
===============================================