如何使Junit测试按顺序运行方法

14

大家好!我有一个新问题要问你们。我正在使用不同的缓存管理器向缓存中添加一些数据,但我遇到了问题。我是使用junit和spring来做这件事情的。当我运行测试时,测试方法会随机执行,但我需要它们按顺序执行。怎么办?下面是一些代码和控制台输出:

Service类:

@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

请帮忙!! =)


3
为什么你想有序地执行它们?我认为测试应该能够以任何顺序运行。您可以按照传统方式创建一个TestSuite来完成这项任务。 - Dave Newton
我需要这样做,因为我正在将一些数据添加到缓存中,然后从缓存中获取它,最后才将其删除。这就是原因。 - PAcan
@DaveNewton,所以,“cancelOrder”应该先执行,然后是“orderProduct”。这是一个工作流程吗?请记住,您的建议适用于单元测试,而不是所有情况。还有一种称为集成测试的东西。 - RamPrakash
@RamPrakash 再看一下测试。这些是单元测试。这些单元测试以随机顺序执行,因为它们是单元测试。单元测试不应该用作后续单元测试的数据设置。也许你想告诉 OP 这个。 - Dave Newton
3个回答

49

从版本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");
    }
}

查看JUnit 4.11版本发布说明


9

JUnit在测试运行时无法保证测试的执行顺序,这取决于测试运行的环境和上下文,因此强烈建议不要使用测试的排序来影响测试行为。可以使用 @Before 注释来为每个测试提供一个干净的工作空间,并在测试中设置特定的测试条件。

以下问题的答案提供了很好的解释并链接到一些有用的资源:如何在 JUnit4 中按特定顺序运行测试方法?


4
JUnit 4.11增加了一些很棒的功能,可以让你控制测试执行的顺序。详见Test Execution Order

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接