gpt4 book ai didi

java - 在 teamcity 中覆盖或聚合测试结果

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

我有 teamcity 工作,有 2 个步骤:
1.执行测试。
2. 重新运行失败。

第 1 步中有 3 个测试失败,重新运行后只有 1 个测试失败。

Teamcity 生成包含 4 个失败测试而不是 1 个的报告。如何以通过状态覆盖第 1 步中失败的测试结果?

编辑

例如我的套件如下所示:

<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name="Suite 1" thread-count="5" parallel="methods">
<test name="Test 1">
<classes>
<class name="unittest.TestNGTest"/>
</classes>
</test>
</suite>

Java 代码:



import org.testng.Assert;
import org.testng.IRetryAnalyzer;
import org.testng.ITestResult;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;

public class TestNGTest {


@AfterMethod
public void afterMethod() {
System.out.println(Thread.currentThread().getId() + " afterMethod");
}

@BeforeMethod
public void beforeMethod() {
System.out.println(Thread.currentThread().getId() + " beforeMethod");
}

@DataProvider
public Object[][] dp1() {
return new Object[][]{
{1},
{2}
};
}

@Test(dataProvider = "dp1")
public void testM1(int param) {
Assert.assertTrue(param > 3);
}

@DataProvider
public Object[][] dp2() {
return new Object[][]{
{1},
{2},
{3},
{4},
{5},
{6},
{7}
};
}

@Test(dataProvider = "dp2")
public void testM2(int param) {
Assert.assertFalse(param == 7);
}

}

运行后,我的代码会生成重新运行测试套件,而 teamcity 在第二步中运行该套件:

<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name="Suite 1" thread-count="1" parallel="methods">
<test name="Test 1">
<parameter name="indicies" value = "0:1"/> <-- that means that i want rerun only first and second dataprovider configuration -->
<classes>
<class name="unittest.TestNGTest">
<include name = testM1/>
</class>
</classes>
</test>
<test name="Test 2">
<parameter name="indicies" value = "6"/> <-- that means that i want rerun only seventh dataprovider configuration -->
<classes>
<class name="unittest.TestNGTest">
<include name = testM2/>
</class>
</classes>
</test>
</suite>

如您所见,我仅在一个线程中使用相应的数据提供程序配置重新运行失败的测试用例

最佳答案

可以通过三种方法解决此问题。

  1. 如果您使用 Cucumber Framework,那么我建议你使用ExtendedCucumberRunner它有内置的支持重新运行失败的测试而不增加测试计数,您会不需要单独重新运行失败的测试用例
  2. 如果您使用TestNG框架,则实现IRetry接口(interface)来重试在同一运行中失败的测试用例。
  3. 或者作为最后的手段,自行解析结果并排除重复测试

编辑:

so if i will rerun my case all 50 configurations would be re-run

不正确。只有那些在这些配置中失败的数据点才会运行。

I want to rerun only failed dataprovider sets (not all from each case) in 1 thread.

您可以在实现 IRetry 接口(interface)时对其进行控制。因此,我请求分享一些最低限度的可重现代码来演示您的问题。

I've created parser which creates me new xml suite with necessary indexes from dataprovider, which i can run in 1 thread.

我建议您考虑以编程方式运行 TestNG 测试。

正如您所说,您有大量需要运行的测试,但并非全部都需要重试逻辑,我建议您将需要重试逻辑的测试放在一个套件下,然后在其他套件下休息,并将 IRetry 监听器添加到重试套件。

就并行执行而言,重试逻辑将遵循与正常测试相同的路线,因此如果您在 1 个线程中运行,它将在单线程中运行,如果您在多个线程中运行,那么它将并行运行。基本上,重试逻辑会在每个测试方法实例之后调用。

编辑2:

TestNG.xml 文件:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name="Suite 1" data-provider-thread-count="10" parallel="methods">
<test name="Test 1">
<classes>
<class name="unittest.TestNGTest"/>
</classes>
</test>
</suite>

测试类:

package unittest;


import org.testng.Assert;
import org.testng.IRetryAnalyzer;
import org.testng.ITestResult;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;

public class TestNGTest {

public static class IRetryImplementation implements IRetryAnalyzer {
private int retries = 3;

@Override
public boolean retry(ITestResult result) {
return (retries--) > 0 && !result.isSuccess();
}
}

@AfterMethod
public void afterMethod() {
System.out.println(Thread.currentThread().getId() + " afterMethod");
}

@BeforeMethod
public void beforeMethod() {
System.out.println(Thread.currentThread().getId() + " beforeMethod");
}

@DataProvider(parallel = true)
public Object[][] dp1() {
return new Object[][]{
{1},
{2}
};
}

@Test(dataProvider = "dp1", retryAnalyzer = IRetryImplementation.class)
public void testM1(int param) {
System.out.println(Thread.currentThread().getId() + " test 1");
Assert.assertTrue(param > 1);
}

@DataProvider(parallel = true)
public Object[][] dp2() {
return new Object[][]{
{1},
{2}
};
}

@Test(dataProvider = "dp2", retryAnalyzer = IRetryImplementation.class)
public void testM2(int param) {
System.out.println(Thread.currentThread().getId() + " test 2");
Assert.assertTrue(param > 1);
}

}

输出:

15 beforeMethod
16 beforeMethod
16 test 2
18 beforeMethod
18 test 2
17 beforeMethod
Test ignored.
16 afterMethod
16 beforeMethod
16 test 2
Test ignored.
16 afterMethod
16 beforeMethod
16 test 2
Test ignored.
16 afterMethod
16 beforeMethod
16 test 2
16 afterMethod
15 test 1
Test ignored.
17 test 1
17 afterMethod
15 afterMethod
15 beforeMethod
18 afterMethod
15 test 1
Test ignored.
15 afterMethod
15 beforeMethod
15 test 1
Test ignored.
15 afterMethod
15 beforeMethod
15 test 1
15 afterMethod

我创建了一个最小的代码来演示重试的工作原理。如这段代码所示,失败的数据点与生成原始测试方法并为其提供数据点的线程在同一线程中运行。此外,正如您所看到的,当它重试运行失败的方法时,它还会重新运行配置方法。

关于java - 在 teamcity 中覆盖或聚合测试结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58973491/

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