Selenium junit测试 - 我如何按顺序在测试中运行测试?
我使用junit和eclipse编写函数测试。Selenium junit测试 - 我如何按顺序在测试中运行测试?
运行单个测试时,它按照我在课堂上设置的顺序运行。
例如,
testCreateUser
testJoinUserToRoom
testVerify
testDeleteUser
然而,当我运行该测试作为套件的一部分,(因此在一个包中)的顺序是随机的。
它将例如进行验证,然后删除用户,然后加入userToRoom,然后删除用户。
我在套件中的测试不相互依赖。然而,测试中的每个单独测试都依赖于它们以正确的顺序运行。
有什么办法可以实现这个目标吗?
谢谢。
你补充不能保证在JUnit中执行测试方法的顺序。
测试的执行类的一套被保证(如果你使用Suite)内的顺序,但执行的顺序,如果测试类是通过反射发现不是(举例来说,如果你在Eclipse中运行一个包,或者从maven或ant运行一组测试)。这可以由ant或maven来定义,但它并不是由JUnit定义的。
一般而言,JUnit的执行顺序的测试方法在它们被在源文件中所定义,但不是所有的JVM保证这一点(格外与JVM 7)。如果某些方法是从抽象基础测试类继承的,那么这可能不适用。 (这听起来像你的情况,但我不能从你的描述中知道)。
欲了解更多信息,请参阅我的回答Has JUnit4 begun supporting ordering of test? Is it intentional?。
那么你能做些什么来解决你的问题?有两种解决方案。在你原来的例子中,你实际上只有一个测试(验证),但你有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-annotated方法。如果您使用Junit不是进行严格的单元测试,而是更像情景驱动的系统测试,那么这将成为首选替代方案。这不一定是这种使用的最佳工具,但在某些情况下它确实工作得很好。
那么,你就必须到目前为止是有一个单一的测试:
@Test public void testUserNominalLifeCycle(...
可能的话,如果你感觉贤惠,可以通过额外的新的测试,如
@Test public void testUserWhoNeverJoinsARoom(...
感谢Soru,包内的测试可以按任意顺序运行。但是这些测试中的测试需要按正确的顺序运行。所以它必须以admin身份登录创建一个用户并将该用户加入到一个房间。然后以该用户身份登录并运行测试。我不确定如何在没有任何依赖的情况下运行这种测试......? – 2011-12-15 10:41:07
对于单元式测试,您可以拥有创建所需用户的@Before(或@BeforeClass)以及用于清理它们的相应注释后的函数。 – soru 2011-12-15 12:09:37