我有一个测试用例,要求我多次注销。我希望注销成为自己的测试/方法。而不是每次都创建注销方法,还有另一种方法可以调用该方法吗?
@Test(priority = 1, groups = {"Regression"})
public void createaccount() throws Exception {}
@Test(priority = 2, groups = {"Regression"})
public void addpayment() throws Exception {}
@Test(priority = 3, groups = {"Regression"})
public void logout() throws Exception {}
@Test(priority = 4, groups = {"Regression"})
public void login() throws Exception {}
@Test(priority = 5, groups = {"Regression"})
public void logout() throws Exception {}
答案 0 :(得分:1)
使用@AfterMethod
有一个问题。您需要将它添加到每个测试类。因此,如果您的所有测试类都需要有选择地执行某些方法,那么您可以通过实现TestNG侦听器org.testng.IInvokedMethodListener#afterInvocation
并将其连接到[使用{ {1}}注释或使用org.testng.IInvokedMethodListener
标记或使用服务加载器。有关详细信息,请参阅here]
检查@Listener
对象并依赖方法名称有一个问题,明天如果您将<listener>
方法重构为其他内容,那么您需要记住在选择性执行中更改它地方也是。您可以改为创建自定义注释ITestResult
,检查侦听器中是否存在此注释,如果存在,则让它调用该方法。
以下是我所指的示例实现。
以下是标记注释的外观:
@Test
这是一个新界面,它定义了注销机制应该是什么样子。我们稍后将利用此接口触发实际测试类的注销。
@Logout
测试类将实现上述接口import java.lang.annotation.Retention;
import java.lang.annotation.Target;
import static java.lang.annotation.ElementType.METHOD;
@Retention(java.lang.annotation.RetentionPolicy.RUNTIME)
@Target({METHOD})
/**
* Marker annotation that signifies that a {@link ILogout#signout()} operation has to be performed
* for the current method.
*/
public @interface Logout {
}
,因为它希望对某些/**
* Defines the logging out capabilities that any test class may possess.
*/
public interface ILogout {
/**
* Perform the actual sign out.
*/
void signout();
}
方法执行选择性注销。
ILogout
最后,TestNG监听器如下所示:
@Test
此解决方案可确保即使方法名称经过重构,您的代码也不会受到影响。
答案 1 :(得分:0)
您可以使用@AfterMethod注释来执行此操作。然后在每个测试方法之后调用此方法。如果您只想为某些测试方法运行它,可以传入ITestResult以获取测试方法名称。您可能还希望包含alwaysRun=true
,以便即使测试失败也会运行注销方法。
这样的事情:
@AfterMethod(alwaysRun=true)
public void logout(ITestResult result) {
if (result.getName().equalsIgnoreCase("addpayment")) {
// do logout
}
}
希望这会有所帮助。