junit多线程测试

wyzuomumu 发布于 2010/12/29 14:19
阅读 2K+
收藏 1

现在在做junit多线程测试的项目,里面是用junit3进行开发的,先开始的junit测试是串行模式(按顺 序执行),之后要更改为多线程测试,其中包含的有启动多个数据库和从数据库获得的数据保存到一个公共类中的一个Map容器中,当改为多线程时,Map容器 中的数据总会被最新的线程覆盖掉,而且线程在执行junit test方法的时候出现了一些错误,在test方法所引用的方法能同步的都同步了(除了一些引用了jar包里面的方法没有同步外),运行的时候还是会出现 test方法里面获取的数据是已经覆盖的值;有多个thread进入到一个test方法中(thread的无规律性).

哪位大虾能帮帮我,小弟先在这里谢谢了......

加载中
0
疯狂的艺术家
疯狂的艺术家

2个问题

1覆盖的原因是key重复吧,
2多线程情况下不要使用hashmap 而使用 java.util.concurrent.ConcurrentHashMap 。

0
wyzuomumu
wyzuomumu

我是在运行多个junit test方法的时候不能同步,而且在junit test方法里面还引用的有被封装在jar包里的方法,那如何将多个test方法同步呢????

0
疯狂的艺术家
疯狂的艺术家

引用来自#3楼“yanwang”的帖子

我是在运行多个junit test方法的时候不能同步,而且在junit test方法里面还引用的有被封装在jar包里的方法,那如何将多个test方法同步呢????

这几个test方法时有顺序的是吗?

0
wyzuomumu
wyzuomumu

每个junit test方法都没有先后顺序,就是在跑的时候会有多个线程进入到一个test方法里面的情况,所以现在想要把每个test方法同步起来,简单的在方法上加"synchronized"关键字是不管用的,不知道如何将test方法同步起来......

0
疯狂的艺术家
疯狂的艺术家

哦这样啊,不要多个实例就可以啦。

0
wyzuomumu
wyzuomumu

能说的更具体点吗,"不要多个实例"我不是很明白!

0
疯狂的艺术家
疯狂的艺术家

引用来自#7楼“yanwang”的帖子

能说的更具体点吗,"不要多个实例"我不是很明白!

多线程操作的时候,在同步时建立在对同一个对象的基础上(除非是static)

 

Resource1 rs = new Resource1();  
   
       new Thread() {  
           public void run() {  
              rs.f();  
           }  
       }.start();  

   new Thread() {  
           public void run() {  
              rs.f();  
           }  
       }.start();  

比如上面,对f方法加同步,是起作用的,但是你若像下面就不可以了。

 

Resource1 rs = new Resource1();  
Resource1 rs2 = new Resource1();     
       new Thread() {  
           public void run() {  
              rs.f();  
           }  
       }.start();  

   new Thread() {  
           public void run() {  
              rs2.f();  
           }  
       }.start();  

你的明白?

0
wyzuomumu
wyzuomumu

/********************************************************************************************************************************
       * Methode de test du scenario nominal de la reaffectation c'est à dire : 

       *     - reception d'une demande de mission en entree   
       */
    public void testScenarioNominalReaffectation() {
        receptionDemandeMissionEntree();
        receptionAcquittementDemandeMissionEntree();
        receptionCompteRenduPriseEntree();
        receptionDemandeReaffectationMissionEntree();
        receptionAcquittementReaffectationMissionEntree();
        receptionCompteRenduDeposeEntree();
    }

这个test方法是junit中多个suite里面的一个类中的test方法,这个test方法里面引用的方法是在这个类里面的,不过test引用的方法里面还调用的有其他已封装好的jar包里面的方法,现在是通过同步每个test方法来运行多线程的。

如果按您说的那样好像是不能同步了???

0
疯狂的艺术家
疯狂的艺术家

引用来自#9楼“yanwang”的帖子

/********************************************************************************************************************************
       * Methode de test du scenario nominal de la reaffectation c'est à dire : 

       *     - reception d'une demande de mission en entree   
       */
    public void testScenarioNominalReaffectation() {
        receptionDemandeMissionEntree();
        receptionAcquittementDemandeMissionEntree();
        receptionCompteRenduPriseEntree();
        receptionDemandeReaffectationMissionEntree();
        receptionAcquittementReaffectationMissionEntree();
        receptionCompteRenduDeposeEntree();
    }

这个test方法是junit中多个suite里面的一个类中的test方法,这个test方法里面引用的方法是在这个类里面的,不过test引用的方法里面还调用的有其他已封装好的jar包里面的方法,现在是通过同步每个test方法来运行多线程的。

如果按您说的那样好像是不能同步了???

还是没理解你的意思,你可以将问题简化成一小段代码,大家讨论一下。

0
wyzuomumu
wyzuomumu

那我就举个例子吧。(主要是让类中的每个test方法独立起来,相当于事务中的原子性)

比如有两个类其中包含了很多test方法和其他一些为test方法服务的方法,然后junit会将这两个类收集起来放在TestSuite中。现在的问题是用多线程跑junit中的所有的test方法的时候会有多个线程跑到一个test方法中,如果将两个类中的所有的test方法独立起来,那样的话不论是哪个线程跑哪个test方法都是没有问题的。关键是现在不知道如何将test方法独立起来。因为test方法中引用的方法里面会有调用别的类里面的方法和封装在jar包里面的方法。

返回顶部
顶部