`
dbp_cn
  • 浏览: 81479 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Junit单元测试子线程不执行

    博客分类:
  • java
 
阅读更多

养成写单元测试是个好习惯,这样能在前期把大部分边界问题测试清楚,减少代码的bug,提升项目上线的信心,但是我们在用junit进行单元测试的时候有时候会遇到很多坑,不断总结不但可以提高些代码的水平,还能避免下次再犯同类错误,最近就遇到一个用单元测试进行多线程测试的坑。

直接上代码:

public class RuleFilterThread{

public RuleFilterThread(Map<String, String> dataMap,  Rule rule, RuleFilter ruleFilter,Class<?> filterClass,Class ruleClass) {
        this.rule = rule;
        this.ruleFilter = ruleFilter;
        this.dataMap = dataMap;
        this.filterClass =filterClass;
        this.ruleClass=ruleClass;
    }

    @Override
        try {
            //compile class
            //TODO: optimize to cache compiled class .
//            Class<?> clazz = ClassLoaderUtil.loadClass(convertClassNameWithId(filterScript, ruleFilter.getId()));
            Object result = ClassLoaderUtil.execute(filterClass, FILTER_METHOD, dataMap);
            logger.info("execute rule filter result {}",result);
            if (!(result instanceof Boolean)) {
                logger.error("rule filter {} of rule {} filter method return value is not correct ,should return boolean value", ruleFilter.getId(), rule.getId());
                return;
            }

            if ((boolean) result) {
                logger.info("start handle sample rate ...");
                //采样率,qps等处理
                if (handleSapmleRate(rule.getSamplingRate())) {
                    logger.info("start to call rule script:{}",rule.getRuleScript());
                    // 调用规则配置
//                    Class<?> clazz1 = ClassLoaderUtil.loadClass(convertClassNameWithId(ruleScript, rule.getId()));
                    Object callRuleRes =  ClassLoaderUtil.execute(ruleClass, PROCESS_METHOD, dataMap);
                    System.out.println("result: "+callRuleRes);
                    // 验证结果保存
                    saveCheckResult((Map)callRuleRes, rule, dataMap, null);
                }
            }
        } catch (Exception e) {
            logger.error("Error occured  ", e);
            saveCheckResult(null, rule, dataMap, e);
        }

    }

    public static String convertClassNameWithId(String code, String className,int id) {
        return StringUtils.replace(code, className, className + id);
    }
}

写了一个线程来对数据进行规则过滤,其中用到了反射工具进行类执行,然后写了个单元测试:

  @Test
    public void testRuleThread()throws  Exception{
        Map map=new HashMap<String,String>();
        map.put("__biz_table_id","2");
        map.put("id","111");
        Rule rule=ruleRepository.findByBizTableId(Integer.parseInt((String)map.get("__biz_table_id")));
        RuleFilter ruleFilter=ruleFilterRepository.findByRuleId(rule.getId());

        Class<?> filterClass = ClassLoaderUtil.loadClass(RuleFilterThread.convertClassNameWithId(ruleFilter.getFilterScript(),"RuleFilter", ruleFilter.getId()));

        Class<?> ruleClass = ClassLoaderUtil.loadClass(RuleFilterThread.convertClassNameWithId(rule.getRuleScript(),"ProcessImp", rule.getId()));

        RuleFilterThread ruleFilterThread=new RuleFilterThread(map,rule,ruleFilter,filterClass,ruleClass);
       Thread t1= new Thread(ruleFilterThread);
       t1.start();
   //    t1.join();

    }

 这里其实没有就是先动态编译类,然后执行线程,但是在调试的时候,程序会半途终止,但是没有任何异常信息,开始以为是代码问题,但是尝试通过controller调用就没有任何问题,经过度娘才发现是junit不支持线程调用,当单元测试结束后,程序就会自己终止。

解决办法:

1,现场加上join方法,如上加入t1.join()即可

2,通过main方法测试就不会有此问题。

分享到:
评论

相关推荐

    有关Junit和多线程测试的问题

    介绍有关Junit和多线程测试的问题。Junit和许多开源软件项目集成在一起,但是Junit执行多线程的单元测试有一些问题。这篇文章介绍Junit的一个扩展类库———GroboUtils

    轻松构建和运行多线程的单元测试

    但是,创建多线程的单元测试并不容易,测试需要考虑测试线程间的同步,数据共享等。针对Java并行程序的测试,结合扩展JUnit的多线程测试工具,本文介绍了一种在集成开发环境中,创建符合用户要求的多线程单元测试...

    junit-toolbox:使用JUnit 4编写自动化测试的有用类

    替代JUnit运行器Parameterized ,该JUnit运行器对每个参数集同时执行测试。 替代JUnitRunners Suite和Categories ,它允许您使用通配符模式指定测试套件类的子类。 此外,您可以包括和/或排除多个类别。 - ...

    精品软件测试资源-自动化测试工具,自动化测试框架.zip

    JUnit: 最著名的xUnit类的单元测试框架,但是不仅仅可以做单元测试。 TestNG: 更强大的Java测试框架,灵活可扩展,支持注解和多线程。 pytest: 最强大的Python测试框架,可定制性高,插件丰富。 unittest: Python...

    JUnitPerf:使用JUnit构建的API性能测试框架

    JUnitPerf 使用JUnit构建的API性能测试框架JUnitPerf提供了对JUnit4框架的扩展,允许将单元测试扩展为性能评估测试。 该库最适合测试远程API端点或组件/集成测试。 如果尝试以纳秒级延迟对代码块进行基准测试,则应...

    xml执行java源码-WeTest:WeTest是处理API接口测试的轻量级自动化测试框架,java语言实现,采用JUnit4开源框架,支持

    3.支持失败重试,包括执行中(@Retry注解)和结果跑完(根据Ant/Maven失败日志,扫失败日志,JUnitCore跑失败用例,多线程执行); 4.邮件通知结果。 框架图: 二. 开发环境 Java IDE,JDK6以上,JUnit4,Mysql,Ant...

    parallel_cuke_jvm:CucumberJVM的配置,允许动态并行测试运行

    它搜索功能文件,找到已选择要运行的方案和方案大纲,然后将它们参数化为单独的功能文件,每个功能文件都有自己的基于JUnit的测试运行程序文件。 这允许Maven Surefire插件将每个测试插入其自己的线程中。 将其绑定...

    limited-resource-queued-tests:运行多线程故障安全测试,其中每个线程都可以独占访问有限的资源

    使用maven-failsafe-plugin同时运行需要排他性使用有限资源的JUnit测试 当某些测试更改系统状态时,同时运行测试可能会导致测试不稳定,从而影响同时运行的其他测试。 例如,如果一个应用程序租户上正在运行多个...

    pytest-timeout

    虽然默认情况下,在POSIX系统上pytest将在测试超时后继续执行测试,但这并不总是可能的。 通常,中断挂起测试的唯一肯定方法是终止整个过程。 由于这是一个硬终止( os._exit() ),将不会导致拆卸,JUnit XML输出等...

    突破程序员基本功的16课.part2

    5.8.3 静态初始化块启动新线程执行初始化 5.8.4 注意多线程执行环境 5.9 小结 第6课 流程控制的陷阱 6.1 switch语句陷阱 6.1.1 default分支永远会执行吗 6.1.2 break的重要性 6.1.3 switch表达式的类型 6.2...

    day020-继承加强和设计模式代码和笔记.rar

    1. 单元测试:(掌握) 1. 写一个单元测试类,命名方式:XxxTest(测试类没有main方法) 2. 导入包,Junit4包 选中项目,右键 =&gt; Build Path =&gt; Add Library =&gt; 选中Junit 选中Junit4 =&gt; finish 3. 在...

    Spring.3.x企业应用开发实战(完整版).part2

    16.7.1 对LoginController进行单元测试 16.7.2 使用Spring Servlet API模拟对象 16.7.3 使用Spring RestTemplate测试 16.7.4 使用Selenium测试 16.8 小结 第17章 实战案例开发 17.1 论坛案例概述 17.1.1 论坛整体...

    Spring3.x企业应用开发实战(完整版) part1

    16.7.1 对LoginController进行单元测试 16.7.2 使用Spring Servlet API模拟对象 16.7.3 使用Spring RestTemplate测试 16.7.4 使用Selenium测试 16.8 小结 第17章 实战案例开发 17.1 论坛案例概述 17.1.1 论坛整体...

    espresso-cucumber:使用Espresso测试框架和Cucumber BDD语言和Spoon屏幕截图测试Android应用程序的库

    样本测试执行报告浓咖啡Google创建的Android测试工具库,用于编写简洁,美观,可靠的Android UI测试主要特点: 该死的快更少的不稳定测试(由于与UI线程自动同步) 由于使用了Hamcrest表达式,因此代码更好(更清晰...

    编码

    他们是: itest.threads用于运行测试的执行线程数。 默认值为1。 itest.tests要执行的标准测试名称的逗号分隔列表。 测试将按照给定的顺序执行。 如果未提供,则将执行所有测试bean。 itest.result.runId一个UUID,...

    orientdb-server-1.6.6.zip

    magnetictrackparser.zip,磁道分析器是一个java 7库,可以从银行发行的卡中分析磁道。所有类都是不可变的和线程安全的...有效性由junit测试强制执行。一个build.java库需要maven,它可以解析银行发行的信用卡上的磁条。

    snmp4j_jar

    SNMP4J——一个支持java管理器和代理,支持snmp应用程序接口的类库。 SNMP4J是一个商业类库,而且开源免费,它也是一个有着很高技术艺术性的SNMP执行能力的类库,支持J2SE1.4或更高的版本。... JUNIT测试

    snmp4j_api

    此资源为snmp4j的api SNMP4J——一个支持java管理器和代理,支持snmp应用程序接口的类库。 SNMP4J是一个商业类库,而且开源免费,它也是一个有着很高技术艺术性的SNMP执行能力的类库,支持J2SE1.4或更高... JUNIT测试

Global site tag (gtag.js) - Google Analytics