Java 如何运行指向jar的TestNG测试

Java 如何运行指向jar的TestNG测试,java,testng,Java,Testng,我有一个.Jar文件,其中包含在TestNG测试中运行所需的文件。我想在该Jar文件中运行一个特定的xml文件。我的要求是,是否可以执行指向.Jar文件的TestNG测试,如果可以,我该如何做。Jar只是一个zip文件 您可以使用jar xf testfile.jar提取该文件,并访问所需的文件 这个答案也可能对你有所帮助 您可以使用-xmlpathinjar suites/GroupBased_Tests.xml选项运行xml。 如果有帮助,可以参考maven的步骤 有关您可以使用的其他选项

我有一个.Jar文件,其中包含在TestNG测试中运行所需的文件。我想在该Jar文件中运行一个特定的xml文件。我的要求是,是否可以执行指向.Jar文件的TestNG测试,如果可以,我该如何做。

Jar只是一个zip文件

您可以使用
jar xf testfile.jar
提取该文件,并访问所需的文件


这个答案也可能对你有所帮助


您可以使用-xmlpathinjar suites/GroupBased_Tests.xml选项运行xml。
如果有帮助,可以参考maven的步骤


有关您可以使用的其他选项,请参阅Testng文档。

您可以阅读Testng.xml并以编程方式运行它,而无需提取jar

首先,您需要读取xml并对其进行解析。 在这里,我创建了一些bean类来匹配我的xml文件格式。 这是我的bean类,创建一组与您的需求相匹配的类

@XmlRootElement(name = "suite")
public class Suite {

private String name;
private String verbose = "1";
private boolean parallel =false;

private List<Test> testCases = new ArrayList<Test>();
private List<Parameter> parameters = new ArrayList<Parameter>();

@XmlAttribute
public String getName() {
    return name;
}


public void setName(String name) {
    this.name = name;
}

@XmlAttribute
public String getVerbose() {
    return verbose;
}


public void setVerbose(String verbose) {
    this.verbose = verbose;
}

@XmlAttribute
public boolean isParallel() {
    return parallel;
}


public void setParallel(boolean parallel) {
    this.parallel = parallel;
}

@XmlElement(name = "test")
public List<Test> getTestCases() {
    return testCases;
}

public void setTestCases(List<Test> testCases) {
    this.testCases = testCases;
}

@XmlElement(name = "parameter")
public List<Parameter> getParameters() {
    return parameters;
}


public void setParameters(List<Parameter> parameters) {
    this.parameters = parameters;
}
}
最后,我们运行该套件:

public static void runSuite(String jarFilePath, Suite s)
        throws MalformedURLException, ClassNotFoundException {
    //Don't confuse : XmlSuite here, is the standard testNg class. our bean class is Suite
    XmlSuite suite = new XmlSuite();
    suite.setName(s.getName());

    for (Test t : s.getTestCases()) {
        XmlTest test = new XmlTest(suite);
        test.setName(t.getName());
        List<XmlClass> classes = new ArrayList<XmlClass>();
        for (TestClass tc : t.getClasses()) {
            Class cls =  loadClass(jarFilePath, tc.getName());
            if (cls != null) {
                XmlClass xClass = new XmlClass(cls, false);
                classes.add(xClass);
                test.setXmlClasses(classes);
            }
        }
    }
    List<XmlSuite> suites = new ArrayList<XmlSuite>();

    suites.add(suite);
    TestNG tng = new TestNG();

    tng.setXmlSuites(suites);
    tng.run();
}

public Class loadClass(String jarFilePath, String className) throws MalformedURLException,
        ClassNotFoundException {
File jarFile  = new File(jarFilePath);
    if (jarFile.isFile()) {
        URL url = jarFile.toURL();
        URL[] urls = new URL[] { url };
        ClassLoader cl = new URLClassLoader(urls);
        return cl.loadClass(className);
    } else {
        return null;
    }
}
publicstaticvoidrunsuite(字符串jarFilePath,suites)
引发畸形的DurLexException,ClassNotFoundException{
//不要混淆:这里的XmlSuite是标准的testNg类,我们的bean类是Suite
XmlSuite=newxmlsuite();
setName(s.getName());
for(测试t:s.getTestCases()){
XmlTest=新的XmlTest(套件);
test.setName(t.getName());
列表类=新的ArrayList();
for(TestClass tc:t.getClasses()){
类cls=loadClass(jarFilePath,tc.getName());
如果(cls!=null){
XmlClass xClass=新的XmlClass(cls,false);
添加(xClass);
test.setXmlClasses(类);
}
}
}
列表套件=新的ArrayList();
套房。添加(套房);
TestNG tng=新的TestNG();
tng.setXmlSuites(套房);
tng.run();
}
公共类loadClass(String jarFilePath,String className)引发畸形的异常,
ClassNotFoundException{
File jarFile=新文件(jarFilePath);
if(jarFile.isFile()){
URL=jarFile.toURL();
URL[]URL=新URL[]{URL};
ClassLoader cl=新的URLClassLoader(URL);
返回cl.loadClass(类名);
}否则{
返回null;
}
}

您想以编程方式执行jar吗?是的。我有一个从maven build生成的jar文件。假设我的jar文件名是
myproject-1.0-SNAPSHOT
这个jar包含我的
src/target
文件夹资源。所以我想执行位于生成的jar文件中的
testngTestfile.xml
。我想要以编程方式执行。例如:用户将文件名作为参数给jar,并以编程方式执行该测试。
executeTest(.jarfilelocation,fileNametobeExecuted)
。在该方法中,将运行测试。这可能会有所帮助。。那将是一个单独的问题,谢谢。据你所知,TestNG中有任何工具可以通过编程方式对jar运行测试吗?如果你是这样问的,你也可以通过编程方式在TestNG中运行测试,而无需在jar中打包
public static void runSuite(String jarFilePath, Suite s)
        throws MalformedURLException, ClassNotFoundException {
    //Don't confuse : XmlSuite here, is the standard testNg class. our bean class is Suite
    XmlSuite suite = new XmlSuite();
    suite.setName(s.getName());

    for (Test t : s.getTestCases()) {
        XmlTest test = new XmlTest(suite);
        test.setName(t.getName());
        List<XmlClass> classes = new ArrayList<XmlClass>();
        for (TestClass tc : t.getClasses()) {
            Class cls =  loadClass(jarFilePath, tc.getName());
            if (cls != null) {
                XmlClass xClass = new XmlClass(cls, false);
                classes.add(xClass);
                test.setXmlClasses(classes);
            }
        }
    }
    List<XmlSuite> suites = new ArrayList<XmlSuite>();

    suites.add(suite);
    TestNG tng = new TestNG();

    tng.setXmlSuites(suites);
    tng.run();
}

public Class loadClass(String jarFilePath, String className) throws MalformedURLException,
        ClassNotFoundException {
File jarFile  = new File(jarFilePath);
    if (jarFile.isFile()) {
        URL url = jarFile.toURL();
        URL[] urls = new URL[] { url };
        ClassLoader cl = new URLClassLoader(urls);
        return cl.loadClass(className);
    } else {
        return null;
    }
}