51Testing软件测试论坛

标题: 自动生成testng.xml [打印本页]

作者: 测试积点老人    时间: 2018-12-18 15:43
标题: 自动生成testng.xml

工作中接到一个任务,调研是否可以实现rpc服务自动diff功能。本篇是其中的一个子功能,测试类的testng.xml自动实现。

实现原理: 1.实例化XmlSuite类 2.扫描目录下所有的classes文件,然后遍历class的所有方法是否包含@Test注解 3.步骤2中的必要信息放到XmlSuite中 4.保存XmlSuite到指定位置

主要方法:

  1. /**
  2. * 生成testng.xml
  3. * @return
  4. */
  5. public Boolean CreateTestNGXML() {
  6.         String prefix = "Test";
  7.     String classesDir = "D:/opt/cases";
  8.     XmlSuite suite = new XmlSuite();
  9.     XmlTest xmlTest = new XmlTest(suite);
  10.     List<XmlClass> xmlClasses = new ArrayList<>();

  11.     // testng.xml全名
  12.     suite.setFileName(prefix + "_testng.xml");
  13.     // 不设置这个suite.toXml()会报NPT
  14.     suite.setJunit(false);
  15.     suite.setName(prefix);
  16.     xmlTest.setName(prefix);

  17.     try {
  18.         // 新建classloader实例
  19.         URLClassLoader loader = URLClassLoader.newInstance(new URL[] {}, getClass().getClassLoader());
  20.         // 测试用例class所在目录加到classloader的classpath中
  21.         TestNGUtil.addPath(loader, new File(classesDir).toURI().toURL());

  22.         // 循环遍历所有的class文件
  23.         Collection<File> classFiles = FileUtils.listFiles(new File(classesDir), new WildcardFileFilter("*.class"),
  24.                 TrueFileFilter.INSTANCE);
  25.         for (File f : classFiles) {
  26.             // 包含$说明为内部类
  27.             if (f.getName().contains("$")) {
  28.                 continue;
  29.             }
  30.             XmlClass xmlClass = new XmlClass();
  31.             List<XmlInclude> includes = new ArrayList<>();

  32.             // 只要class名称不要后缀
  33.             String clazzName = f.getName().replace(".class", "");
  34.             xmlClass.setName(clazzName);

  35.             Class<?> clazz = Class.forName(clazzName, false, loader);
  36.             // 遍历所有方法,找到包含@Test标注的方法
  37.             for (Method m : clazz.getMethods()) {
  38.                 if (hasTestAnnotation(m)) {
  39.                     XmlInclude xmlInclude = new XmlInclude(m.getName());
  40.                     includes.add(xmlInclude);
  41.                 }
  42.             }
  43.             xmlClass.setIncludedMethods(includes);
  44.             xmlClasses.add(xmlClass);
  45.         }

  46.         xmlTest.setXmlClasses(xmlClasses);

  47.         // 保存到文件系统中
  48.         FileUtils.write(new File(classesDir + "/" + suite.getFileName()), suite.toXml(), Charset.defaultCharset());
  49.     } catch (MalformedURLException e) {
  50.         e.printStackTrace();
  51.     } catch (ClassNotFoundException e) {
  52.         e.printStackTrace();
  53.     } catch (Exception e) {
  54.         e.printStackTrace();
  55.     }

  56.     return null;
  57. }

  58. /**
  59. * 判断当前方法是否包含@Test标注
  60. *
  61. * @param m
  62. * @return
  63. */
  64. private Boolean hasTestAnnotation(Method m) {
  65.     List<Annotation> annotations = Arrays.asList(m.getAnnotations());
  66.     for (Annotation annotation : annotations) {
  67.         if (annotation.annotationType().getName().equals(Test.class.getName())) {
  68.             return Boolean.TRUE;
  69.         }
  70.     }
  71.     return Boolean.FALSE;
  72. }
复制代码

额外的类TestNgUtil.java

  1. /**
  2.      * addURL为protected方法,需要借助于reflect包才能实现动态添加class到classpath中
  3.      *
  4.      * @param urlClassLoader
  5.      * @param url
  6.      * @throws Exception
  7.      */
  8.     public static void addPath(ClassLoader urlClassLoader, URL url) throws Exception {
  9.         Class<URLClassLoader> urlClass = URLClassLoader.class;
  10.         Method method = urlClass.getDeclaredMethod("addURL", new Class[] { URL.class });
  11.         method.setAccessible(true);
  12.         method.invoke(urlClassLoader, new Object[] { url });
  13.     }
复制代码

import信息

  1. import java.io.File;
  2. import java.lang.annotation.Annotation;
  3. import java.lang.reflect.Method;
  4. import java.net.MalformedURLException;
  5. import java.net.URL;
  6. import java.net.URLClassLoader;
  7. import java.nio.charset.Charset;
  8. import java.util.ArrayList;
  9. import java.util.Arrays;
  10. import java.util.Collection;
  11. import java.util.List;

  12. import org.apache.commons.io.FileUtils;
  13. import org.apache.commons.io.filefilter.TrueFileFilter;
  14. import org.apache.commons.io.filefilter.WildcardFileFilter;
  15. import org.testng.annotations.Test;
  16. import org.testng.xml.XmlClass;
  17. import org.testng.xml.XmlInclude;
  18. import org.testng.xml.XmlSuite;
  19. import org.testng.xml.XmlTest;

  20. import com.aaa.qa.utils.TestNGUtil;
复制代码







欢迎光临 51Testing软件测试论坛 (http://bbs.51testing.com/) Powered by Discuz! X3.2