有条件地跳过TestNG测试

时间:2013-11-16 18:46:41

标签: java testing testng skip

我对TestNG注释没有多少经验,但我正在尝试使用TestNG框架和零售网站的POM设计模式构建测试套件。我打算使用数据驱动的方法。我的计划是通过excel驱动我的测试场景,而不是使用testng.xml。

例如,我将拥有多个测试套件,它们只是包名称TestSuite下的各种类文件。 TestSuite名称将列在excel中,用户可以通过将运行模式更改为TRUE / FALSE来设置测试套件的运行模式。 在这里,我计划实施一个条件检查,看看Run模式是否为FALSE,并相应地跳过testsuite,即testsuite类。

我们是否有任何直接的方法来使用TestNG来实现相同的目标,或者请通过一个小例子为此建议任何解决方案。

5 个答案:

答案 0 :(得分:14)

请在测试开头添加以下代码行,这将跳过您的测试用例

throw new SkipException("Skipping the test case");

答案 1 :(得分:7)

您可以使用TestNG的annotation transformerdisabled注释的@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);