如果 20% 或前 20 个测试用例测试方法失败,如何停止 selenium 自动化?
How do I stop selenium automation if 20% or 1st 20 test cases test methods are failed?
我有100个测试用例,如果20%或前20个测试用例都失败了,我该如何停止执行?
已经有 testng ITestResult 我应该在哪里中断构建?
@Test(retryAnalyzer = ReTryFail.class, dataProvider = "SanityTCTest", dataProviderClass = utility.Xlsdataprovider.class, groups = "Dashboard", alwaysRun = true)
public void Sanity_TC001(LinkedHashMap<String, String> data) throws InterruptedException, SQLException {
Some code
}
@Test(retryAnalyzer = ReTryFail.class, dataProvider = "SanityTCTest", dataProviderClass = utility.Xlsdataprovider.class, groups = "Dashboard", alwaysRun = true)
public void Sanity_TC002(LinkedHashMap<String, String> data) throws InterruptedException, SQLException {
Some code
}
@Test(retryAnalyzer = ReTryFail.class, dataProvider = "SanityTCTest", dataProviderClass = utility.Xlsdataprovider.class, groups = "Dashboard", alwaysRun = true)
public void Sanity_TC003(LinkedHashMap<String, String> data) throws InterruptedException, SQLException {
Some code
}
///////////////////////////////
如果结果“FAIL 超过 20”,我可以在哪里破解此套件?
我需要创建新的 class 还是可以在下面添加?
@AfterMethod(alwaysRun = true)
public void reporterDataResults(ITestResult Result) throws InterruptedException {
boolean flag = false;
Testfail = TestResultStatus.Testfail;
/*System.out.println("test fail flag in AfterMethod: " + Testfail); */
if (Result.getStatus() == ITestResult.SKIP) {
Resmark.put(Result.getName(), "");
captureScreenShot(Result, "SKIP", getDriver());
Reporter.log(Result.getName() + " is SKIPPED");
Add_Log.info(Result.getName() + " is SKIPPED");
TestResultTL.put(Result.getName(), "SKIP");
if (!(getDriver() == null)) {
closeWebBrowser();
}
} else if (Result.getStatus() == ITestResult.FAILURE) {
Collection<String> values = TestResultStatus.mpaskeysnew.get(Result.getName());
String resultout = String.join(" | ", values);
System.out.println(resultout);
Resmark.put(Result.getName(), resultout);
captureScreenShot(Result, "FAIL", getDriver());
Reporter.log(Result.getName() + " is FAIL");
Add_Log.info(Result.getName() + " is FAIL");
if (!(getDriver() == null)) {
closeWebBrowser();
}
TestResultTL.put(Result.getName(), "FAIL");
} else {
captureScreenShot(Result, "PASS", getDriver());
Resmark.put(Result.getName(), "");
Reporter.log(Result.getName() + " is PASS");
Add_Log.info(Result.getName() + " is PASS");
if (!(getDriver() == null)) {
closeWebBrowser();
}
TestResultTL.put(Result.getName(), "PASS");
}
Testskip = false;
TestResultStatus.Testfail = false;
}
你可以实现 ISuiteListener
and in onFinish
method you'll have access to ISuite
and ISuiteResult
那你可以
public void onFinish(ISuite suite) {
final Map<java.lang.String,ISuiteResult> res = suite.getResults();
for (ISuiteResult r : res.values()) {
context = r.getTestContext() ;
failedTestCases =context.getFailedTests().size();
}
}
size()
将为您提供该套件的失败测试次数。一旦知道该数字,您就可以使用 this
中的策略实施停止执行
如果您的测试用例在不同的套件中,那么在每次调用 onFinish
方法时,您可以计算每个套件失败的测试用例的数量,并基于该停止执行。
另一种选择是实施ITestListener
. In onTestFailure
method you have access to ITestResult
您可以计算 onTestFailure
方法被调用了多少次,并根据该次数停止执行。我认为实施 ITestListener
更适合您的情况,也更容易。
在这里,我进行了编辑以解释您将如何实施侦听器
import org.testng.ISuiteListener;
public class listener implements Itestlistener {
public int i = 0;
public void onTestFailure(ITestResult result) {
result.getName();
i++;
//your break logic goes here
if (i ==20){
// do something or call some function to stop execution
}
}
}
您可以阅读有关 testng 侦听器的更多信息 here。
对于上面的 EDIT(如果你想这样做的话)。尽管我仍然认为您应该实现更简洁的侦听器。只有在测试失败时才会调用。
但是和我在onTestFailure
方法中做的一样,添加一个计数器并在else if
中增加它。
public int i = 0; //do this in your class
然后在你的方法中
else if (Result.getStatus() == ITestResult.FAILURE) {
i++; //increase counter here
Collection<String> values = TestResultStatus.mpaskeysnew.get(Result.getName());
String resultout = String.join(" | ", values);
System.out.println(resultout);
Resmark.put(Result.getName(), resultout);
captureScreenShot(Result, "FAIL", getDriver());
Reporter.log(Result.getName() + " is FAIL");
Add_Log.info(Result.getName() + " is FAIL");
if (!(getDriver() == null)) {
closeWebBrowser();
}
TestResultTL.put(Result.getName(), "FAIL");
if (i==20){
// stop execution here
}
}
我有100个测试用例,如果20%或前20个测试用例都失败了,我该如何停止执行? 已经有 testng ITestResult 我应该在哪里中断构建?
@Test(retryAnalyzer = ReTryFail.class, dataProvider = "SanityTCTest", dataProviderClass = utility.Xlsdataprovider.class, groups = "Dashboard", alwaysRun = true)
public void Sanity_TC001(LinkedHashMap<String, String> data) throws InterruptedException, SQLException {
Some code
}
@Test(retryAnalyzer = ReTryFail.class, dataProvider = "SanityTCTest", dataProviderClass = utility.Xlsdataprovider.class, groups = "Dashboard", alwaysRun = true)
public void Sanity_TC002(LinkedHashMap<String, String> data) throws InterruptedException, SQLException {
Some code
}
@Test(retryAnalyzer = ReTryFail.class, dataProvider = "SanityTCTest", dataProviderClass = utility.Xlsdataprovider.class, groups = "Dashboard", alwaysRun = true)
public void Sanity_TC003(LinkedHashMap<String, String> data) throws InterruptedException, SQLException {
Some code
}
///////////////////////////////
如果结果“FAIL 超过 20”,我可以在哪里破解此套件? 我需要创建新的 class 还是可以在下面添加?
@AfterMethod(alwaysRun = true)
public void reporterDataResults(ITestResult Result) throws InterruptedException {
boolean flag = false;
Testfail = TestResultStatus.Testfail;
/*System.out.println("test fail flag in AfterMethod: " + Testfail); */
if (Result.getStatus() == ITestResult.SKIP) {
Resmark.put(Result.getName(), "");
captureScreenShot(Result, "SKIP", getDriver());
Reporter.log(Result.getName() + " is SKIPPED");
Add_Log.info(Result.getName() + " is SKIPPED");
TestResultTL.put(Result.getName(), "SKIP");
if (!(getDriver() == null)) {
closeWebBrowser();
}
} else if (Result.getStatus() == ITestResult.FAILURE) {
Collection<String> values = TestResultStatus.mpaskeysnew.get(Result.getName());
String resultout = String.join(" | ", values);
System.out.println(resultout);
Resmark.put(Result.getName(), resultout);
captureScreenShot(Result, "FAIL", getDriver());
Reporter.log(Result.getName() + " is FAIL");
Add_Log.info(Result.getName() + " is FAIL");
if (!(getDriver() == null)) {
closeWebBrowser();
}
TestResultTL.put(Result.getName(), "FAIL");
} else {
captureScreenShot(Result, "PASS", getDriver());
Resmark.put(Result.getName(), "");
Reporter.log(Result.getName() + " is PASS");
Add_Log.info(Result.getName() + " is PASS");
if (!(getDriver() == null)) {
closeWebBrowser();
}
TestResultTL.put(Result.getName(), "PASS");
}
Testskip = false;
TestResultStatus.Testfail = false;
}
你可以实现 ISuiteListener
and in onFinish
method you'll have access to ISuite
and ISuiteResult
那你可以
public void onFinish(ISuite suite) {
final Map<java.lang.String,ISuiteResult> res = suite.getResults();
for (ISuiteResult r : res.values()) {
context = r.getTestContext() ;
failedTestCases =context.getFailedTests().size();
}
}
size()
将为您提供该套件的失败测试次数。一旦知道该数字,您就可以使用 this
如果您的测试用例在不同的套件中,那么在每次调用 onFinish
方法时,您可以计算每个套件失败的测试用例的数量,并基于该停止执行。
另一种选择是实施ITestListener
. In onTestFailure
method you have access to ITestResult
您可以计算 onTestFailure
方法被调用了多少次,并根据该次数停止执行。我认为实施 ITestListener
更适合您的情况,也更容易。
在这里,我进行了编辑以解释您将如何实施侦听器
import org.testng.ISuiteListener;
public class listener implements Itestlistener {
public int i = 0;
public void onTestFailure(ITestResult result) {
result.getName();
i++;
//your break logic goes here
if (i ==20){
// do something or call some function to stop execution
}
}
}
您可以阅读有关 testng 侦听器的更多信息 here。
对于上面的 EDIT(如果你想这样做的话)。尽管我仍然认为您应该实现更简洁的侦听器。只有在测试失败时才会调用。
但是和我在onTestFailure
方法中做的一样,添加一个计数器并在else if
中增加它。
public int i = 0; //do this in your class
然后在你的方法中
else if (Result.getStatus() == ITestResult.FAILURE) {
i++; //increase counter here
Collection<String> values = TestResultStatus.mpaskeysnew.get(Result.getName());
String resultout = String.join(" | ", values);
System.out.println(resultout);
Resmark.put(Result.getName(), resultout);
captureScreenShot(Result, "FAIL", getDriver());
Reporter.log(Result.getName() + " is FAIL");
Add_Log.info(Result.getName() + " is FAIL");
if (!(getDriver() == null)) {
closeWebBrowser();
}
TestResultTL.put(Result.getName(), "FAIL");
if (i==20){
// stop execution here
}
}