如何配置TestNG使测试套件指定测试方法不存在时直接报错终止?
可行解决方案
你原来的方案核心问题是依赖本地源码目录读取类信息,实际上运行时编译后的测试类已经在JVM的类路径下,直接通过TestNG提供的XML配置信息+反射即可完成校验,完全不需要源码文件。
优化后的校验逻辑
你可以直接遍历套件XML中配置的每一个类,针对单个类校验其配置的包含方法是否存在,还能避免不同类重名方法导致的误校验问题,优化后的代码如下:
Log.info("**********About to begin executing suite: " + suite.getName()); List<String> notSupportedMethods = new ArrayList<>(); // 遍历套件中所有测试、所有配置的类 suite.getXmlSuite().getTests().forEach(xmlTest -> { xmlTest.getClasses().forEach(xmlClass -> { String className = xmlClass.getName(); try { // 直接加载类(编译后的类在classpath中,不需要源码) Class<?> clazz = Class.forName(className); // 获取当前类所有@Test注解标注的方法名 Set<String> existedTestMethods = Arrays.stream(clazz.getDeclaredMethods()) .filter(method -> method.isAnnotationPresent(Test.class)) .map(Method::getName) .collect(Collectors.toSet()); // 校验当前类配置的所有包含方法 xmlClass.getIncludedMethods().forEach(xmlInclude -> { String methodName = xmlInclude.getName(); if (!existedTestMethods.contains(methodName)) { notSupportedMethods.add(String.format("类[%s]中不存在的测试方法[%s]", className, methodName)); } }); } catch (ClassNotFoundException e) { notSupportedMethods.add(String.format("套件配置的测试类不存在:%s", className)); e.printStackTrace(); } }); }); // 存在非法配置则终止执行 if (!notSupportedMethods.isEmpty()) { System.out.println("*****=====XML套件文件存在非法配置=====*****:"); notSupportedMethods.forEach(System.out::println); System.exit(1); }
TestNG 7.4.0版本适配方案
如果你升级到7.4.0版本,除了上述校验逻辑外,还可以额外增加IInvokedMethodListener监听器,或者在上述校验逻辑中增加跳过方法的提示:你可以在拿到所有有效测试方法后,和XML配置的包含方法比对,将不存在的方法以警告日志输出即可解决官方无提示的问题。
方案优势
- 完全不依赖源码目录,仅需编译后的测试类在运行时类路径中,适配所有执行环境
- 按类维度校验方法,不会出现重名方法误判问题
- 执行效率更高,仅处理套件中实际配置的类和方法
内容的提问来源于stack exchange,提问作者GregMa
相关产品推荐
相关产品推荐

