我对TestNG注释没有多少经验,但我正在尝试使用TestNG框架和零售网站的POM设计模式构建测试套件。我打算使用数据驱动的方法。我的计划是通过excel驱动我的测试场景,而不是使用testng.xml。
例如,我将拥有多个测试套件,它们只是包名称TestSuite下的各种类文件。 TestSuite名称将列在excel中,用户可以通过将运行模式更改为TRUE / FALSE来设置测试套件的运行模式。 在这里,我计划实施一个条件检查,看看Run模式是否为FALSE,并相应地跳过testsuite,即testsuite类。
我们是否有任何直接的方法来使用TestNG来实现相同的目标,或者请通过一个小例子为此建议任何解决方案。
答案 0 :(得分:14)
请在测试开头添加以下代码行,这将跳过您的测试用例
throw new SkipException("Skipping the test case");
答案 1 :(得分:7)
您可以使用TestNG的annotation transformer将disabled
注释的@Test
属性设置为true或false。
示例:
public class MyTransformer implements IAnnotationTransformer {
public void transform(ITest annotation, Class testClass,
Constructor testConstructor, Method testMethod){
if (isTestDisabled(testMethod.getName()))) {
annotation.setEnabled(false);
}
}
public boolean isTestDisabled(String testName){
// Do whatever you like here to determine if test is disabled or not
}
}
答案 2 :(得分:1)
自6.13以来throw new SkipException("Skipping the test case");
无法工作。我必须在抛出异常之前设置状态,否则测试状态将是失败而不是跳过:
iTestResult.setStatus(TestResult.SKIP);
throw new SkipException("Skipping the test case");
可能会在下一版本中修复/更改,有关详细信息,请参阅https://github.com/cbeust/testng/issues/1632。
答案 3 :(得分:-2)
throw new skipException("skipping the test case")
它将跳过测试用例而不是完整的套件。不是检查套件运行模式,而是在@beforeTest
方法中将测试用例的运行模式检查为Y / N.然后,如果您将运行模式设置为N,则抛出异常。
throw new skipException("skipping test case as run mode is y").
这将跳过您的测试用例。这只是一个替代方案,即使我没有找到任何其他方法来跳过整个套件。如果您不想运行该套件,上述情况将满足将每个测试用例的运行模式保持为N的目的。它将跳过该套件的所有测试用例,并且将成为您跳过这些测试用例的报告的一部分。
示例如下所示
package com.qtpselenium.suiteC;
import org.testng.SkipException;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
import com.qtpselenium.util.TestUtil;
public class TestCaseC1 extends TestSuiteBase{
//Checking runMode of the Test case in Suite
@BeforeTest
public void checkTestcaseskip(){
//this.getclass().getSimpleName() method returns the name of the class
App_Logs.debug("checking run mode of " +this.getClass().getSimpleName() + " testcase");
if(!TestUtil.IsTestCaseRunnable(suiteCxlsx, this.getClass().getSimpleName())){
App_Logs.debug("Run mode of testcase " + this.getClass().getSimpleName() + " is N");
throw new SkipException("Run mode of testcase " + this.getClass().getSimpleName() + " is N");
}else
App_Logs.debug("Run mode of testcase " + this.getClass().getSimpleName() + " is Y");
}
@Test(dataProvider="getTestData")
public void TestcaseC1(
String col1,
String col2,
String col3,
String col4
){
App_Logs.debug("Test data of testcase : " + this.getClass().getSimpleName());
App_Logs.debug(col1+"--"+col2+"--"+col3+"--"+col4);
}
//Data provide to TestcaseC1
@DataProvider
public Object[][] getTestData(){
return TestUtil.getdata(suiteCxlsx, this.getClass().getSimpleName());
}
}
答案 4 :(得分:-2)
我找到的最佳解决方案,我们可以在@BeforeTest Annotation方法中查看套件的运行模式,如果它找到了N,那么抛出新的跳过异常,它将跳过该套件的所有测试用例,我正在做一个错误捕获try catch块中的Exception,这就是为什么它会在throw skip异常后检查所有测试用例。
如果在套件Excel中找到套件运行模式为N,请在下面找到右边示例如何跳过套件中的所有测试用例。通过testng.xml运行它
$sales = DB::table('sales')
->join('drugs', 'drugs.id', '=', 'sales.drug_id')
->select('sales.*','drugs.name', DB::raw('sum(sales.quantity_sold) as total_sales'))
->whereYear('date_sold','>','2014')
->whereYear('date_sold','<','2017')
->get()->groupBy('sales.drug_id');
$stocks = DB::table('sales')
->join('drugs', 'drugs.id', '=', 'sales.drug_id')
->select('sales.*','drugs.name', DB::raw ('AVG(sales.quantity_sold) as average_sales'))
->whereMonth('date_sold','=', Carbon::today()->month)
->get()->groupBy('sales.drug_id');
$data = $sales->merge($stocks);