gpt4 book ai didi

java - TestNG 禁用某些 dataProvider 集

转载 作者:行者123 更新时间:2023-12-02 12:11:59 25 4
gpt4 key购买 nike

我有一个使用 dataProvider 的测试,我只想执行 2 个运行之一,因为其中一个测试预计会失败。

@Test(dataProvider = "data")
public void testThatPassesAndFails(boolean test, String whatever) {
Assert.assertTrue(test);//Once scenario passes, other fails
}

@DataProvider(name = "data")
public static Object[][] paramData() {
return new Object[][] {
{true, "blah"},
{false, "blah2"}
};
}

实际上,我们有一个自定义注释,将测试与跟踪预期测试失败的测试数据库联系起来。对于非数据提供者测试,我们使用 IAnnotationTransformer 并调用 annotation.setEnabled(false),这对于单实例测试非常有效。

但是,我们有一些数据提供者测试,我们希望运行除 1 或 2 组数据之外的所有数据。是否可以仅禁用或删除某些调用?我现在能得到的最接近的结果是实现 IInvokedMethodListener 并在 beforeInitation 方法中抛出 SkipException 。这还不错,但我不想在测试结果中出现跳过,因为它们会影响通过率。我知道我也可以使用另一个监听器来操作 TestNG 结果,但这会变得困惑。

是否有某种方法使用 IAnnotationTransformerIAnnotationTransformer2 获取使用 dataProvider 的测试的每次迭代的参数值,然后禁用?即使我可以操纵 dataProvider 方法来删​​除“坏”情况,那也是可行的。

最佳答案

从较高层面来看,解决此问题的方法如下:

  1. 将参数添加到您的 <suite> (或)<test>套件 xml 文件中的标记表示过滤。
  2. 让您的测试类实现 IHookable接口(interface)。
  3. IHookable内实现检查数据提供者传递给实际测试方法的参数是否满足(1)中提到的过滤标准。
  4. 如果过滤条件通过,则运行测试方法,否则显式将状态设置为 SKIP并设置自定义异常(exception)。
  5. 构建 TestListenerAdaptor自定义,过滤掉所有状态为 SKIP 的测试结果其异常是您的自定义异常。

这应该可以解决问题。

测试类如下所示:

import org.testng.Assert;
import org.testng.IHookCallBack;
import org.testng.IHookable;
import org.testng.ITestResult;
import org.testng.Reporter;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;

import java.util.Arrays;

public class TestclassSample implements IHookable {
@Override
public void run(IHookCallBack callBack, ITestResult testResult) {
Object[] parameters = callBack.getParameters();
String runType = parameters[0].toString();
String expectedInputType = testResult.getTestContext().getCurrentXmlTest().getAllParameters().get("runType");
if (runType.equalsIgnoreCase(expectedInputType)) {
callBack.runTestMethod(testResult);
} else {
testResult.setStatus(ITestResult.SKIP);
testResult.setThrowable(new DataSetSkipException("Skipping data set " + Arrays.toString(parameters) ));
}
}

@Test(dataProvider = "dp")
public void testMethod(String inputType, int number) {
String expectedInputType = Reporter.getCurrentTestResult().getTestContext().getCurrentXmlTest().getAllParameters().get("runType");
Assert.assertTrue(number > 0);
Assert.assertEquals(inputType, expectedInputType);
System.err.println("(" + inputType + ", " + number + ")");
}

@DataProvider(name = "dp")
public Object[][] getData() {
return new Object[][]{
{"bad", 100},
{"good", 500},
{"good", 600},
{"good", 200},
{"new", 300}
};
}

public static class DataSetSkipException extends RuntimeException {
public DataSetSkipException(String message) {
super(message);
}
}
}

监听器的外观如下:

import org.testng.ITestContext;
import org.testng.ITestNGMethod;
import org.testng.ITestResult;
import org.testng.TestListenerAdapter;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class BadResultRemovingListener extends TestListenerAdapter {

@Override
public void onFinish(ITestContext testContext) {
Iterator<ITestResult> skipTestsIterator = testContext.getSkippedTests().getAllResults().iterator();
List<ITestNGMethod> methodsToRemove = new ArrayList<>();
while (skipTestsIterator.hasNext()) {
ITestResult result = skipTestsIterator.next();
if (result.getThrowable() instanceof TestclassSample.DataSetSkipException) {
methodsToRemove.add(result.getMethod());
}
}
for (ITestNGMethod method : methodsToRemove) {
testContext.getSkippedTests().removeResult(method);
}
}
}

TestNG 套件 xml 文件如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="46472511_Suite" parallel="false" verbose="2">
<listeners>
<listener class-name="com.rationaleemotions.stackoverflow.qn46472511.BadResultRemovingListener"/>
</listeners>
<parameter name="runType" value="good"/>
<test name="46472511_test1">
<classes>
<class name="com.rationaleemotions.stackoverflow.qn46472511.TestclassSample"/>
</classes>
</test>
</suite>

当您从 IDE 中运行它时,您可能会看到一些尴尬的结果,但是当您从 Maven 等构建工具运行时,您的输出将如下所示:

11:36 $ mvn clean test -DsuiteXmlFile=46472511.xml
[INFO] Scanning for projects...
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building testbed 1.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO]
[INFO] --- maven-surefire-plugin:2.19.1:test (default-test) @ testbed ---

-------------------------------------------------------
T E S T S
-------------------------------------------------------
Running TestSuite
...
... TestNG 6.12 by Cédric Beust (cedric@beust.com)
...

(good, 500)
(good, 600)
(good, 200)
Tests run: 5, Failures: 0, Errors: 0, Skipped: 2, Time elapsed: 0.313 sec - in TestSuite

Results :

Tests run: 3, Failures: 0, Errors: 0, Skipped: 0

[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 5.783 s
[INFO] Finished at: 2017-09-29T11:36:21+05:30
[INFO] Final Memory: 37M/331M
[INFO] ------------------------------------------------------------------------

关于java - TestNG 禁用某些 dataProvider 集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46472511/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com