如何在Java Web应用程序中以编程方式执行未编译的testNg测试用例?

问题描述 投票:0回答:1

我正在使用Java通过通过代码创建testng xml来以编程方式运行测试用例(TestNg测试用例)。运行完全正常。

问题:

我想执行正在实时上载的测试用例,这意味着我的服务器正在运行,并且我正在将新记录的测试用例(未编译,将.java文件传递到此正在运行的服务器中)传递到上面创建的testng xml java码。但是我遇到错误,即无法在类路径中找到类:com.packagename.SampleTestNgTestcase当我重新运行服务器并调用此功能时,它将执行测试用例。

我一直在浏览并尝试通过实践用于编译TestNg测试用例的技术来找到解决方案,但没有成功,因为在哪里可以找到如何编译测试用例的地方。

非常感谢您提供有关如何执行非编译测试用例的方式或其他方式的帮助,以及如何以编程方式编译testcase.java文件。如果需要有关问题清除的更多详细信息,我会!

java testng testng-eclipse testng-annotation-test
1个回答
0
投票
假设您的CLASSPATH没有任何问题(下面的代码不能解决这个问题,这是一个简单的示例,您可以用来入门。)>

参考:大部分实现都是受this blog启发和借鉴的。

假设您有一个名为sample.txt的文本文件,其内容如下:

package foo.bar; import org.testng.annotations.Test; public class Example { @Test public void testMethod() { System.err.println("Hello world"); } }

import java.nio.file.Path; public class ClassInfo { String packageName; String className; String sourceCode; Path javaFile; Path classFile; }

import static java.nio.charset.StandardCharsets.UTF_8;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLClassLoader;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.Arrays;
import java.util.stream.Collectors;
import javax.tools.JavaCompiler;
import javax.tools.ToolProvider;
import org.testng.TestNG;

public class DynamicTestNgExecutor {

  public static void main(String[] args) throws Exception {
    DynamicTestNgExecutor.runTests("src/test/resources/sample.txt", "foo.bar.Example");
  }

  public static void runTests(String sourcePath, String className) throws Exception {
    ClassInfo classInfo = parse(sourcePath, className);
    saveSource(classInfo);
    compileSource(classInfo);
    runClass(classInfo, className);
  }

  private static void runClass(ClassInfo classInfo, String className)
      throws MalformedURLException, ClassNotFoundException {
    URL classUrl = classInfo.javaFile.getParent().toFile().toURI().toURL();
    if (!classInfo.packageName.isEmpty()) {
      File file = classInfo.javaFile.toFile();
      int count = classInfo.packageName.split("\\Q.\\E").length;
      for (int i = 0; i <= count; i++) {
        file = file.getParentFile();
      }
      classUrl = file.toURI().toURL();
    }
    URLClassLoader classLoader = URLClassLoader.newInstance(new URL[] {classUrl});
    Class<?> clazz = Class.forName(className, true, classLoader);
    TestNG testNG = new TestNG();
    testNG.setTestClasses(new Class[] {clazz});
    testNG.setVerbose(2);
    testNG.run();
  }

  public static ClassInfo parse(String sourcePath, String className) throws FileNotFoundException {
    InputStream stream = new FileInputStream(sourcePath);
    String separator = System.getProperty("line.separator");
    BufferedReader reader = new BufferedReader(new InputStreamReader(stream));
    ClassInfo info = new ClassInfo();
    info.className = className;
    info.sourceCode = reader.lines().collect(Collectors.joining(separator));
    info.packageName = packageName(info.sourceCode);
    return info;
  }

  private static void compileSource(ClassInfo classInfo) {
    JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
    compiler.run(System.in, System.out, System.err, classInfo.javaFile.toFile().getAbsolutePath());
    classInfo.classFile = classInfo.javaFile.getParent().resolve(classInfo.className + ".class");
  }

  public static void saveSource(ClassInfo classInfo) throws IOException {
    String folder = folderName(classInfo.packageName);
    String tmpProperty = System.getProperty("java.io.tmpdir") + File.separator + folder;
    final boolean success = new File(tmpProperty).mkdirs();
    if (!success) {
      throw new IllegalStateException("Encountered problems when creating the package structure " + tmpProperty);
    }
    classInfo.javaFile = Paths.get(tmpProperty, simpleClassName(classInfo.className) + ".java");
    Files.write(classInfo.javaFile, classInfo.sourceCode.getBytes(UTF_8));
  }

  private static String simpleClassName(String className) {
    String[] parts = className.split("\\Q.\\E");
    if (parts.length == 1) {
      //No package name in the class
      return parts[0];
    }
    int lastButOne = parts.length - 1;
    return parts[lastButOne];
  }

  private static String folderName(String pkg) {
    if (pkg.isEmpty()) {
      return "";
    }
    pkg = pkg.replaceAll("\\Q.\\E", "/");
    return pkg;
  }

  private static String packageName(String source) {
    String separator = System.getProperty("line.separator");
    String pkg =
        Arrays.stream(source.split(separator))
            .filter(each -> each.contains("package"))
            .findAny()
            .orElse("");
    if (pkg.isEmpty()) {
      return "";
    }
    return pkg.replaceAll("package ", "").replaceAll(";", "");
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.