繁体   English   中英

硒单元测试-如何在测试中按顺序运行测试?

[英]Selenium junit tests - how do I run tests within a test in sequential order?

我正在使用带有eclipse的junit编写功能测试。

当运行单个测试时,它将按照我在类中设置它们的顺序运行。

例如。

testCreateUser
testJoinUserToRoom
testVerify
testDeleteUser

但是,当我将此测试作为套件的一部分运行时(在包中),顺序是随机的。

例如,它将进行验证,然后删除用户,然后删除joinuserToRoom,然后删除Createuser。

我在套件中的测试并不相互依赖。 但是,测试中的每个单独测试都取决于它们以正确的顺序运行。

有什么办法可以实现?

谢谢。

您不能保证JUnit中测试方法的执行顺序。

套件中测试的执行顺序是可以保证的(如果使用Suite ),但是通过反射找到测试类的执行顺序是不能保证的(例如,如果您在Eclipse中运行包,或来自maven或ant的一组测试)。 这可能由ant或maven定义,但JUnit并未定义。

通常,JUnit按照在源文件中定义的顺序执行测试方法,但是并非所有JVM都保证这样做(尤其是JVM 7)。 如果某些方法是从抽象基测试类继承的,那么这可能也不成立。 (这听起来像您的情况,但我无法从您的描述中看出来)。

有关此的更多信息,请参阅我对JUnit4是否已开始支持测试排序的答复 这是故意的吗?

那么,您该怎么做才能解决您的问题呢? 有两种解决方案。

在原始示例中,您实际上只有一个测试(验证),但是您有4种方法,两种设置(createUser,joinUserToRoom)和一种拆卸(deleteUser)。 因此,您的第一个选择是使用TestRule尤其是ExternalResource更好地定义您的测试用例。 ExternalResource允许您定义测试的行为之前/之后,类似于@Before/@After 但是, ExternalResource的优点是您可以将其排除在测试范围之外。

因此,您将在外部资源中创建/删除用户:

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 ,在其中可以定义从一个测试到另一个测试的依赖关系。

如果它们具有“正确”的顺序,则它们不是多个测试,而是被错误地注释为多个独立测试的单个测试。

最佳实践将以批准的junit样式(设置-操作-验证)重写它们,并由@Before或@BeforeClass方法进行任何必需的公共设置。

快速的解决方法是使用单个@Test注释的方法,该方法依次调用其他测试方法。 如果您不使用Junit进行严格的单元测试,而是使用场景驱动的系统测试,那将成为首选的选择。 它不一定是用于此类用途的最佳工具,但在某些情况下确实可以很好地工作。

然后,到目前为止,您将需要进行一次测试:

@Test public void testUserNominalLifeCycle(...

然后,如果您感到有德行,可以通过额外的新测试(例如

@Test public void testUserWhoNeverJoinsARoom(...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM