【问题标题】:how to make junit test run methods in order [duplicate]如何按顺序制作junit测试运行方法[重复]
【发布时间】:2013-03-23 03:44:47
【问题描述】:

伙计们!我有一个新问题要问你。我正在使用不同的缓存管理器将一些数据添加到缓存中,我正面临着它的问题。我正在使用junit和spring来做。当我运行测试时,测试方法是随机执行的,但我需要它们按顺序执行。怎么做??这是一些代码和验证控制台输出:

服务类:

@Service("HelloCache")
public class CacheServiceImpl implements CacheInterface {
    @Autowired
    @Qualifier("memcachedClient")
    private MemcachedClient mBean;

    public void Add(String key, Object object) {
        mBean.set(key, 12, object);
    }

    public void Get(String key) {
        mBean.get(key);
    }

    public void Delete(String key) {
        mBean.delete(key);
    }    
}

这里是测试:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "file:src/main/java/spring.xml")
public class UsingMemcachedTest extends TestCase {
    @Autowired
    @Qualifier("HelloCache")
    private CacheInterface emcached;
    private byte[][] i = new byte[2500][3000];
    private String key = "j";
    @Test
    public void testAddBulkObjects() {
        System.out.println("");
        System.out.println("This is async BULK adding test");
        long time = System.currentTimeMillis();
        for (int k=1; k<=1000; k++) {
            emcached.Add(key+k, i);
        }
        long time2 = System.currentTimeMillis();
        long timeE=time2-time;
        System.out.println("Vremya add BULK objects: " + timeE);
        System.out.println("");
    }

    @Test
    public void testGetBulkObjects() {
        System.out.println("");
        System.out.println("This is getting BULK objects test");
        long time = System.currentTimeMillis(); 
        for (int k=1; k<=1000; k++) {
            emcached.Get(key+k);
        }
        long time2 = System.currentTimeMillis();
        long timeE=time2-time;
        System.out.println("Vremya Get object: " + timeE);
        System.out.println("");
    } 

    @Test
    public void testDeleteBulkObjects() {
        System.out.println("");
        System.out.println("This is deleting BULK objects test");
        long time = System.currentTimeMillis();
        for (int k=1; k<=1000; k++) {
            emcached.Delete(key+k);
        }
        long time2 = System.currentTimeMillis();
        long timeE=time2-time;
        System.out.println("Vremya delete object: " + timeE);
        System.out.println("");
    }

然后输出:

This is deleting BULK objects test
Vremya delete object: 137


This is getting BULK objects test
Vremya Get object: 703


This is async BULK adding test
Vremya add BULK objects: 87681

请帮忙!! =)

【问题讨论】:

  • 为什么要按顺序执行?测试应该能够以任何顺序运行,IMO。你总是可以用老式的方式来做一个 TestSuite。
  • 我需要这样做,因为我将一些数据添加到缓存中,然后从缓存中获取它,然后才将其删除。这就是为什么。

标签: java spring junit memcached


【解决方案1】:

从 4.11 版本开始,您可以使用注解指定执行顺序并按方法名称排序:

import org.junit.Test;
import org.junit.FixMethodOrder;
import org.junit.runners.MethodSorters;

@FixMethodOrder(MethodSorters.NAME_ASCENDING)
public class MyTest {

    @Test
    public void test1Create() {
        System.out.println("first");
    }

    @Test
    public void test2Update() {
        System.out.println("second");
    }
}

See JUnit 4.11 Release Notes

【讨论】:

    【解决方案2】:

    JUnit 4.11 添加了一些很酷的东西,让您可以控制Test Execution Order

    【讨论】:

      【解决方案3】:

      JUnit 不承诺测试的运行顺序。根据运行测试的环境和上下文,顺序会有所不同。

      出于这个原因(和其他原因),它被认为是非常糟糕的测试设计,因为它会影响测试的行为。您可以使用 @Before 为您提供一个全新的工作状态,然后为特定测试进行任何设置作为该测试的一部分。

      以下问题的公认答案提供了很好的解释和一些有用资源的链接:How to run test methods in specific order in JUnit4?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-04-17
        • 2012-03-28
        • 2014-08-06
        • 2020-04-25
        • 2013-11-24
        • 1970-01-01
        • 2012-11-16
        • 2015-12-21
        相关资源
        最近更新 更多