举个例子,我有:
@Test
public void login(*Code ommitted*){
测试登录网站。
然后我想做一些从登录开始的其他测试,所以我得到了:
@Test
public void sendUserInvite(){
login();
*Other code omitted*
}
有些东西直观地告诉我这是非常糟糕的做法,但同时如果登录测试做了我需要它,那么为什么不以这种方式重复使用呢?任何人都可以澄清这一点。过了一会儿,我最后在另一个测试开始时做了几次测试,因为它们是进行特定测试的前提条件。
答案 0 :(得分:0)
如果您使用的是TestNG,则可以使用@BeforeClass
,@BeforeSuite
,@BeforeTest
,@BeforeMethod
等,以便在您{之前的某个步骤中启动前提条件{1}}方法
E.g。你在xml中有2个测试:
@Test
我们假设<suite name="Suite0" verbose="1" >
<test name="name0" >
<classes>
<class name="Test0" />
</classes>
</test>
<test name="name1">
<classes>
<class name="Test1"/>
</classes>
</test>
</suite>
和Test0
都扩展了类Test1
然后在BaseTest
:
BaseTest
因此,启动套件时,将调用login方法。请注意public class BaseTest {
@BeforeTest
public void login() {
// smth w/ login
}
}
适用于套件中的每个测试,而不适用于@BeforeTest
的每个方法,这有时会让人感到困惑。
<强> UPD 强>
如果您使用的是 JUnit ,则可以使用@Test
,并且可以在课程中的每个@Before
之前运行带有它的方法。也就是说,它与 TestNG
@Test
相同
@BeforeMethod
执行顺序:
登录
A
退出
登录
B
注销
答案 1 :(得分:0)
根据以下链接,JUnit测试用例被设计为独立运行,每个测试应该彼此独立。我相信你必须重新考虑你的设计并选择像TestNG这样的测试框架,它完全符合你的要求。
Choose order to execute JUnit tests
答案 2 :(得分:0)
如果您觉得需要从另一个测试方法中调用一个测试方法,那么这是一个需要提取类的好兆头。
我建议将login
移到PageObject班级:
public class HomePage {
private final WebDriver driver;
public HomePage(WebDriver driver) {
this.driver = driver;
}
public WelcomePage login(String userName, String password) {
signIn(userName, password);
Assert.assertEquals("sign in failed", userName, getSignedInUser());
return new WelcomePage(driver, userName);
}
private void signIn(String userName, String password) {
// Add code to perform the sign in
}
public String getSignedInUser() {
// Add code to check the current page to see who is reported
// as the signed in user
}
}
然后你的测试看起来像这样:
@Test
public void login() {
HomePage page = new HomePage(driver);
page.login(TEST_USER_NAME, TEST_PASSWORD);
}
@Test
public void sendUserInvite() {
WelcomePage page = new HomePage(driver)
.login(TEST_USER_NAME, TEST_PASSWORD);
page.sendUserInvite(NON_USER_EMAIL_ADDRESS);
}
当然,您的页面对象也可能有一些代码重复(例如,获取登录用户可能是一个常见的问题)。发生这种情况时,您可以为所有页面对象提取基类,也可以为常用逻辑提取辅助类。