junit不同类指定方法批量单元测试

2023-11-02

批量测试不同类里面指定版本的单元测试

每个版本的批量测试如下:修改一下版本号和对应的类名即可。(版本号需要在对应的单元测试方法上加@TestVersion(“v1.0”))

/**
 * v1.0单元测试套件
 * 可以指定测试类,会执行指定类里面的全部测试用例,可以指定多个class,用逗号隔开
 * 使用JaCoCo进行单元测试覆盖率分析时,还需在配置中指定覆盖率包含的包
 */
public class TestSuiteOfV1_0{
    /**
     * 内部类指定需要测试的类和对应的方法版本号
     */
    @SuiteClassesMethods(
            className = {
                    XxxServiceImplTest.class
            },
            version = "v1.0")
    private class TestSuite {
        //v1.0对应方法的批量单元测试
    }


    @Test
    public void testAllCases() {
        TestSuiteCases.testAllCases(TestSuite.class);
    }
}

单元测试上加@TestVersion注解

@Slf4j
@SpringBootTest
@RunWith(SpringRunner.class)
public class XxxServiceImplTest {
    @Autowired
    private XxxService xxxService;

    //可以把Mock对象添加到Spring上下文中
    @MockBean
    private UserService userService;
   
    @BeforeClass
    public static void setSwitch() {
       //dosomething
    }


    @Test
    @Transactional
    @Rollback
    @TestVersion("v1.0")
    public void testUpdate() {
        mockData();
	    xxxService.testUpdate();
    }

    /**
     * mock数据
     */
    private void mockData() {
       //userService.getUser();
    }
}

下面是主要的注解和工具类

/**
 * @Description 测试套件(指定类的指定版本的方法)
 * @Date 2021/4/22 9:56
 * @Created by LIUXING
 */
@Retention(RetentionPolicy.RUNTIME)
@Target({java.lang.annotation.ElementType.TYPE})
public @interface SuiteClassesMethods {
    /**测试的类*/
    Class<?>[]  className();
    /**类对应的测试的版本*/
    String version() ;
}
/**
 * @Description 单元测试版本标识
 * @Date 2021/4/22 21:01
 * @Created by LIUXING
 */
@Retention(RetentionPolicy.RUNTIME)
@Target({java.lang.annotation.ElementType.METHOD})
public @interface TestVersion {
    String value();
}
/**
 * @Description 测试套件里面的所有指定的类和对应的方法,主要用于一个版本里面的相关方法的代码覆盖率测试
 * @Date 2021/4/22 10:24
 * @Created by LIUXING
 */
@Slf4j
public class TestSuiteCases {
    public static <T> void testAllCases(Class<T> clazz) {
        SuiteClassesMethods scm = clazz.getAnnotation(SuiteClassesMethods.class);

        Class<?>[] className = scm.className();
        String version = scm.version(); //版本
        // 根据注解 传的方法,与每个测试类对应
        Map<Class<?>, List<String>> myClassMethodMap = new LinkedHashMap();

        List<List<String>> listMethodsName = new ArrayList<>();

        List<String> failMethods = new ArrayList<>();

        // k游标,遍历methodsName
        int k = 0;
        // 外层for循环,表示类个数
        for (int i = 0; i < className.length; i++) {
            List<String> temp = new ArrayList<>();
            Method[] methods = className[i].getDeclaredMethods();
            for (Method m : methods) {
                TestVersion tv = m.getAnnotation(TestVersion.class);
                if (tv != null && version.equalsIgnoreCase(tv.value())) {
                    temp.add(m.getName());
                }
            }

            listMethodsName.add(i, temp);
            myClassMethodMap.put(className[i], listMethodsName.get(i));
        }


        JUnitCore junitRunner = new JUnitCore();

        List<Result> methodsResult = new ArrayList<>();
        // 失败数
        int failNum = 0;
        // 成功数
        int successNum = 0;
        //  运行时间
        long runTime = 0L;
        // 运行测试方法
        for (Map.Entry<Class<?>, List<String>> entry : myClassMethodMap.entrySet()) {
            Class testClass = entry.getKey();
            List<String> methodList = entry.getValue();
            for (int i = 0; i < methodList.size(); i++) {
                Request request = Request.method(testClass, methodList.get(i));
                Result result = junitRunner.run(request);
                runTime += result.getRunTime();
                // 只添加失败的
                if (result.wasSuccessful()) {
                    successNum++;
                } else {
                    failNum++;
                    failMethods.add(methodList.get(i));
                    methodsResult.add(result);
                }
            }
        }
        log.info("单元测试全部方法列表:{}", JSONObject.toJSONString(listMethodsName));
        if (failMethods.size() > 0) {
            log.info("单元测试失败方法列表:{}", JSONObject.toJSONString(failMethods));
        }
        //打印结果
        printTestResults(clazz.getName(), failNum, successNum, runTime);
    }

    private static void printTestResults(String className, int failNum, int successNum, long runTime) {
        StringBuilder sb = new StringBuilder();
        sb.append("===================== 结果集 =====================");
        sb.append("\n");
        sb.append("用例总数:" + (successNum + failNum));
        sb.append(", 成功数:" + successNum);
        sb.append(", 失败数:" + failNum);
        sb.append(", 运行时间:" + (runTime / 1000) / 60 + " 分钟 " + (runTime / 1000) % 60 + " 秒");
        sb.append("\n");
        sb.append("=================================================");
        sb.append("\n");
        sb.append("\n");
        log.info("{} 单元测试>>>>>>>>>>>>>>>\n {}", className, sb);
    }
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

junit不同类指定方法批量单元测试 的相关文章

随机推荐

  • opencv图像平滑

    图像噪声 由于图像采集 处理 传输等过程不可避免的会受到噪声的污染 妨碍 们对图像 理解及分析处理 常 的图像噪声有 斯噪声 椒盐噪声等 椒盐噪声 椒盐噪声也称为脉冲噪声 是图像中经常 到的 种噪声 它是 种随机出现的 点或者 点 可能是亮
  • 使用vue.js调用摄像头示例

  • linux 下 packet_mmap 前篇 (抓包实现)

    一 概述 本人 linux下 tcpdump 详解前中后 分析过抓包的流程 具体篇章对应如下 前篇了解了libpcap库如何实现抓包 中篇深入内核底层讲述了抓包的原理 后篇自己实现过抓包过程 tcpdump 篇章中讲述的只是原始的抓包流程
  • node:internal/modules/cjs/loader:1024 throw err; ^Error:

    笔者出现的报错情况截图如下 Error Cannot fi1 nd module rtsp2web 安装的库不同 但是不影响解决方法 1 重新安装相对应的文件 npm i rtsp2web 笔者这边 但是还是运行不起来 2 之后可以查看自己
  • rem和mod的区别

    Matlab 如果你不仔细区分的话 可以把rem和mod都当作是求余数的命令 比如 gt gt mod 3 2 ans 1 gt gt rem 3 2 ans 1 可是 通过看他们的帮助文件可以知道 这两个数的符号一致时的结果是一样的 但是
  • nginx 代理访问 springboot项目

    使用的docker部署 不能直接通过 localhost port 访问 容器间之间默认不能互通 修改网络模式 或者 用一下方法 docker inspect format NetworkSettings IPAddress springb
  • Websocket协议原理及Ws服务器代码实现

    一 什么是 WebSocket WebSocket 是 HTML5 开始提供的一种 建立在单个 TCP 连接上的全双工的网络通信协议 WebSocket 协议在2008年诞生 2011年成为国际标准 现在最新版本浏览器都已经支持了 它的最大
  • 趣谈网络协议学习笔记[计算机网络]

    在极客时间上学习刘超老师的趣谈网络协议这门课 听看的时候嗯 觉得自己已经很懂了 理解得也还行 但是当自己整理时会发现有好多小知识点并没有完全理解 这篇博客呢就是在听课后再加上谷歌搜索整理得来 权当学习笔记了 顺便巩固记忆 以后忘了还可以再翻
  • 逆时针打印矩阵

    逆时针打印矩阵 输入矩阵 1 2 38 9 47 6 5 输出 1 2 3 4 5 6 7 8 9 思路 在矩阵外面砌一堵墙 如下 1 1 1 1 1 1 1 2 3 1 1 8 9 4 1 1 7 6 5 1 1 1 1 1 1 遇到 1
  • Idea同步失败Unresolved dependency的解决办法

    下载一些开源的库 经常会碰到一些同步问题 本文就该系列问题单独开一篇文章 和大家缕一缕这样的问题怎么解决 文章在实践过程中会保持同步更新 大家可以点击收藏以便于下次遇到类似问题可以快速找到解决办法 IDEA的同步问题多半为网络环境问题 少部
  • 面试题汇总---深度学习(图像识别,NLP内容)

    文章目录 1 基本概念 1 1 为什么神经网络中深度网络的表现比广度网络表现好 1 2 推导BP算法 1 3 什么是梯度消失和梯度爆炸 1 4 常用的激活函数有哪些 1 5 常用的参数更新方法有哪些 1 6 解决过拟合的方法 数据层面 模型
  • linux系统下启停nginx的命令

    linux 下面启动nginx 和关闭nginx 查看linux 开放的所有端口netstat ntpl 重启服务命令 service network restart 1 进入到安装的目录里面 whereis nginx 2 进入该路径 c
  • python实现名片管理操作系统

    根据黑马程序员演练的python实现名片管理操作系统 一共分为两个文件第一个card main py表示主题搭建的框架 第二个是card tools py表示往框架中填写的主要内容 代码实现在liunx ubuntu 中 实现的是终端操作
  • VIM中的保存和退出命令

    1 打开命令 vim a log 注意后缀名要加上 2 退出命令 按ESC键 跳到命令模式 然后输入 q 不保存退出 或者 wq 保存退出 3 注意 以 和 开头的命令都有历史纪录 可以首先键入 或 然后按上下箭头来选择某个历史命令 w 保
  • cmd高级教程

    CMD高级使用教程 目录 第一章 批处理基础 第一节 常用批处理内部命令简介 1 REM 和 2 ECHO 和 3 PAUSE 4 ERRORLEVEL 5 TITLE 6 COLOR 7 mode 配置系统设备 8 GOTO 和 9 FI
  • 【Android】学习ContentProvider和ContentResolver,写个CRUD案例

    文章目录 前言 1 Provider的代码逻辑 1 创建数据库连接DBHelper类 2 创建一个自定义的Provider类 3 在清单中注册该PersonProvider 2 Resolver的代码逻辑 1 界面布局xml 2 MainA
  • CTF必备技能丨Linux Pwn入门教程——stack canary与绕过的思路

    Linux Pwn入门教程系列分享如约而至 本套课程是作者依据i春秋Pwn入门课程中的技术分类 并结合近几年赛事中出现的题目和文章整理出一份相对完整的Linux Pwn教程 教程仅针对i386 amd64下的Linux Pwn常见的Pwn手
  • Java 手动解析不带引号的JSON字符串的操作

    1 需求说明 项目中遇到了一批不带引号的类JSON格式的字符串 Name Heal Age 20 Tag Coding Reading 需要将其解析成JSON对象 然后插入到Elasticsearch中 当作Object类型的对象存储起来
  • 利用Python+Django快速开发Web毕业设计

    更新完整的源码和论文案例 Python Django Web图书管理系统毕业设计之源码 论文篇 李威威wiwi的博客 CSDN博客 图书管理系统web源码 论文选题 毕业设计的第一步是选择毕设的论文题目 计算机专业的搞一个XXX系统应该是最
  • junit不同类指定方法批量单元测试

    批量测试不同类里面指定版本的单元测试 每个版本的批量测试如下 修改一下版本号和对应的类名即可 版本号需要在对应的单元测试方法上加 TestVersion v1 0 v1 0单元测试套件 可以指定测试类 会执行指定类里面的全部测试用例 可以指