我正在使用带有eclipse的junit编写功能测试。
当运行单个测试时,它将按照我在类中设置它们的顺序运行。
例如。
testCreateUser testJoinUserToRoom testVerify testDeleteUser
但是,当我将此测试作为套件的一部分运行时(在包中),顺序是随机的。
例如,它将执行验证,然后删除用户,然后删除joinuserToRoom然后创建用户。
我在套件中的测试并不相互依赖。但是,测试中的每个单独测试都取决于它们以正确的顺序运行。
有什么办法可以实现?
谢谢。
您不能保证JUnit 中测试 方法 的执行顺序。
可以* 保证套件中测试 类 的执行顺序(如果使用Suite),但是不能通过反射找到测试类的执行顺序(例如,如果您在Eclipse中运行包) ,或来自Maven或ant的一组测试)。这可能由ant或maven定义,但JUnit并未定义。 *
通常,JUnit按照在源文件中定义的顺序执行测试方法,但是并非所有的JVM都保证这样做(尤其是JVM 7)。如果某些方法是从抽象基测试类继承的,那么这可能也不成立。(这听起来像您的情况,但我无法从您的描述中看出来)。
那么,您该怎么做才能解决您的问题呢?有两种解决方案。
在原始示例中,您实际上只有一个测试(验证),但是您有4种方法,两种设置(createUser,joinUserToRoom)和一种拆卸(deleteUser)。因此,您的第一个选择是使用TestRule,尤其是ExternalResource,更好地定义您的测试用例。ExternalResource允许您定义测试之前/之后的行为,类似于@Before/@After。但是,这样做的好处ExternalResource是您可以将其排除在测试范围之外。
ExternalResource
@Before/@After
因此,您将在外部资源中创建/删除用户:
public class UsesExternalResource { @Rule public ExternalResource resource= new ExternalResource() { @Override protected void before() throws Throwable { // create user }; @Override protected void after() { // destroy user }; }; @Test public void testJoinUserToRoom() { // join user to room // verify all ok } }
对我来说,这更容易理解,而且您可以进行独立测试,这是一件好事。这就是我要做的,但是您将需要对测试进行一些重构。您也可以使用RuleChain堆叠这些规则。
如果确实要在测试方法之间引入依赖关系,则第二种选择是查看TestNG,在其中可以定义从一个测试到另一个测试的依赖关系。