【问题标题】:Is TestNG Not Possible To Repeat Class?TestNG不能复读吗?
【发布时间】:2021-01-07 11:06:51
【问题描述】:

我正在尝试构建一个以 TestNG 作为主要框架并以 apache-poi 作为数据源(使用.xlsx 文件)的数据驱动自动化测试,我' ll 将其用于硒目的。

这是从 excel 文件中选择的场景示例:

See image detail here

它可以根据使用它的用户随机选择。模式可以是全部购买、全部消费或混合。

并且期望按照选择的顺序运行。

到目前为止,这是我创建的代码:

大师班

public class Master {
    public static void main(String args[]) throws IOException {
        List<XmlSuite> xmlSuites = new ArrayList<>();
        
        XmlSuite xmlSuite = new XmlSuite();
        xmlSuite.setName("My Suite");
        
        List<XmlTest> xmlTests = new ArrayList<>();
        
        XmlTest xmlTest = new XmlTest(xmlSuite);
        xmlTest.setName("My Test");
        
        Datatable datatable = new Datatable();
        String sourceData = "/path/myFile.xlsx"; 
        int scenarioRowCount = datatable.getRowCount(sourceData, 0);
        
        XmlClass xmlClass = null;
        List<XmlClass> xmlClasses = new ArrayList<>();
        for(int i=1; i<=scenarioRowCount; i++) {
            String scenario = datatable.getCellDatatable(sourceData, 0, i, 0);
            
            Map<String, String> classParam = new HashMap<String, String>();
            classParam.put("scenario", scenario);
            
            if(scenario.contains("purchase")) {
                xmlClass = new XmlClass(Purchase.class);
                xmlClass.setParameters(classParam);
            }else if (scenario.contains("consume")) {
                xmlClass = new XmlClass(Consume.class);
                xmlClass.setParameters(classParam);
            }
            xmlClasses.add(xmlClass);
        }
        
        System.out.println("classes size : " +xmlClasses.size());
        
        xmlTest.setClasses(xmlClasses);
        xmlTests.add(xmlTest);
        
        xmlSuite.setTests(xmlTests);
        xmlSuites.add(xmlSuite);
        
        TestNG testNG = new TestNG();
        testNG.setXmlSuites(xmlSuites);
        testNG.run();
    }
}

购买类

public class Purchase {
    @Test
    @Parameters({"scenario"})
    public void purchase(String scenario) {
        System.out.println(scenario);
        
        //selenium code perform here, purchase a package base on selected
        ....
        ....
    }
}

消费类

public class Consume {
    @Test
    @Parameters({"scenario"})
    public void consume(String scenario) {
        System.out.println(scenario);
        
        //selenium code perform here, consume the quota for a application base on selected
        ....
        ....
    }
}

输出

classes size : 4
purchase quota / 20GB
consume quota / instagram 

===============================================
My Suite
Total tests run: 2, Passes: 2, Failures: 0, Skips: 0
===============================================

我正在使用 TestNG 7.0.0

pom.xml

尽管像上面的示例图像一样有 4 个选定的数据(通过输出确认> classes size : 4),但事实证明,测试只运行了 2 个,并运行了最新的选择。这似乎表明忽略了同一个类。

注意:本题只有2个类,其实不止这些,只是我把它简化了。

这个设计用TestNG可以实现吗(与同一个类的运行权限有关)?

或者有什么建议使用另一个java测试框架?

【问题讨论】:

标签: java selenium apache-poi testng


【解决方案1】:

您可以为每个具有不同参数的类创建 test 标签。

public class Master {
    public static void main(String args[]) throws IOException {
        List<XmlSuite> xmlSuites = new ArrayList<>();
        
        XmlSuite xmlSuite = new XmlSuite();
        xmlSuite.setName("My Suite");
        
        List<XmlTest> xmlTests = new ArrayList<>();
        
   //     XmlTest xmlTest = new XmlTest(xmlSuite);
   //     xmlTest.setName("My Test");
        
        Datatable datatable = new Datatable();
        String sourceData = "/path/myFile.xlsx"; 
        int scenarioRowCount = datatable.getRowCount(sourceData, 0);
        
      //  XmlClass xmlClass = null;
     //   List<XmlClass> xmlClasses = new ArrayList<>();
        for(int i=1; i<=scenarioRowCount; i++) {
            String scenario = datatable.getCellDatatable(sourceData, 0, i, 0);
        
            XmlClass xmlClass = null;
            List<XmlClass> xmlClasses = new ArrayList<>();

            XmlTest xmlTest = new XmlTest(xmlSuite);
            xmlTest.setName("My Test" + i);
              
            Map<String, String> classParam = new HashMap<String, String>();
            classParam.put("scenario", scenario);
            
            if(scenario.contains("purchase")) {
                xmlClass = new XmlClass(Purchase.class);
                xmlClass.setParameters(classParam);
            }else if (scenario.contains("consume")) {
                xmlClass = new XmlClass(Consume.class);
                xmlClass.setParameters(classParam);
            }
            xmlClasses.add(xmlClass);
            xmlTest.setClasses(xmlClasses);
            xmlTests.add(xmlTest);
        
        }
        
    //    System.out.println("classes size : " +xmlClasses.size());
        
     //   xmlTest.setClasses(xmlClasses);
     //   xmlTests.add(xmlTest);
        
        xmlSuite.setTests(xmlTests);

        System.out.println(xmlSuite.toXml());
        xmlSuites.add(xmlSuite);
        
        TestNG testNG = new TestNG();
        testNG.setXmlSuites(xmlSuites);
        testNG.run();
    }
}

。只是示例输出。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "https://testng.org/testng-1.0.dtd">
<suite name="My Suite">
  <test thread-count="5" name="My Test0">
    <classes>
      <class name="testngtest.TestOne">
        <parameter name="scenario" value="purchase/10"/>
      </class> <!-- testngtest.TestOne -->
    </classes>
  </test> <!-- My Test0 -->
  <test thread-count="5" name="My Test1">
    <classes>
      <class name="testngtest.TestOne">
        <parameter name="scenario" value="purchase/20"/>
      </class> <!-- testngtest.TestOne -->
    </classes>
  </test> <!-- My Test1 -->
  <test thread-count="5" name="My Test2">
    <classes>
      <class name="testngtest.TestTwo">
        <parameter name="scenario" value="consume/10"/>
      </class> <!-- testngtest.TestTwo -->
    </classes>
  </test> <!-- My Test2 -->
  <test thread-count="5" name="My Test3">
    <classes>
      <class name="testngtest.TestTwo">
        <parameter name="scenario" value="consume/40"/>
      </class> <!-- testngtest.TestTwo -->
    </classes>
  </test> <!-- My Test3 -->
</suite> <!-- My Suite -->


TestOnepurchase/10
TestOnepurchase/20
TestOneconsume/10
TestOneconsume/40

===============================================
My Suite
Total tests run: 4, Passes: 4, Failures: 0, Skips: 0
===============================================

【讨论】:

  • 感谢您的回复。是的,这是我尝试过的方法,遗憾的是测试看起来很慢,这是因为每个&lt;test&gt; 都有 10 秒的延迟。如果您屈尊,请查看此主题:stackoverflow.com/questions/65285018/…
  • 我确认这个答案。 &lt;test&gt; 是使用 XML 的方式。否则,您可以尝试 DataProvider 功能。对于慢速测试,您可以并行运行它们。
【解决方案2】:

您需要使用测试对象并将其容器 XmlSuite 的并行模式设置为“方法”:

https://testng.org/doc/documentation-main.html#parallel-tests

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-08
    • 1970-01-01
    • 1970-01-01
    • 2018-10-06
    • 2011-07-30
    • 1970-01-01
    • 2013-10-18
    相关资源
    最近更新 更多