51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 1318|回复: 0
打印 上一主题 下一主题

自动生成testng.xml

[复制链接]
  • TA的每日心情
    擦汗
    2 小时前
  • 签到天数: 532 天

    连续签到: 2 天

    [LV.9]测试副司令

    跳转到指定楼层
    1#
    发表于 2018-12-18 15:43:15 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

    工作中接到一个任务,调研是否可以实现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;
    复制代码


    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏
    回复

    使用道具 举报

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

    GMT+8, 2024-11-27 12:25 , Processed in 0.064176 second(s), 23 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

    快速回复 返回顶部 返回列表