Java TestNG不可能重复类吗?

Java TestNG不可能重复类吗?,java,selenium,apache-poi,testng,Java,Selenium,Apache Poi,Testng,我正在尝试构建一个以TestNG为主框架,以apachepoi为数据源(使用.xlsx文件)的数据驱动自动化测试,我将把它用于selenium目的 以下是从excel文件中选择的场景示例: 它可以根据使用它的用户随机选择。模式可以是全部购买、全部消费或混合 期望值按照选择的顺序运行 到目前为止,这是我创建的代码: 硕士班 public class Master { public static void main(String args[]) throws IOException {

我正在尝试构建一个以TestNG为主框架,以apachepoi为数据源(使用
.xlsx
文件)的数据驱动自动化测试,我将把它用于selenium目的

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

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

期望值按照选择的顺序运行

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

硕士班

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
        ....
        ....
    }
}
消费类

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

即使有4个选定的数据,如上面的示例图像(由output>classes size:4确认),结果表明测试只运行2个,并运行最新的选项。它似乎表示忽略同一类

注意:在这个问题中只有两个类,实际上不止这些,只是我让它更简单

这个设计是否可以通过TestNG实现(与运行同一类的权限相关)


或者有没有使用其他java测试框架的建议?

您可以为每个具有不同参数的类创建测试标记

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();
    }
}
公共类主控{
公共静态void main(字符串args[])引发IOException{
List xmlSuites=new ArrayList();
XmlSuite XmlSuite=新的XmlSuite();
setName(“我的套件”);
List xmlTests=new ArrayList();
//XmlTest XmlTest=新的XmlTest(xmlSuite);
//setName(“我的测试”);
Datatable=新的Datatable();
字符串sourceData=“/path/myFile.xlsx”;
int scenarioRowCount=datatable.getRowCount(sourceData,0);
//XmlClass XmlClass=null;
//List xmlClasses=new ArrayList();
对于(int i=1;i
TestOne购买/10
TestOne采购/20
TestOne消费/10
TestOne/40
===============================================
我的套房
运行的测试总数:4,通过率:4,失败率:0,跳过率:0
===============================================

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


谢谢您的回复。是的,这是我尝试过的方法,遗憾的是,测试看起来很慢,这是因为每个
都有10秒的延迟。如果您设计,请查看此线程:我确认此答案。
是XML的方式。否则,您可以尝试数据提供程序功能。对于缓慢的测试,您可以在n parallel.您检查过数据提供程序功能吗?@juherr我无法使用数据提供程序功能,我已检查过。感谢您的帮助和回复。