TestNG:重复一个方法

时间:2017-08-14 18:10:54

标签: testng

我有一个测试用例,要求我多次注销。我希望注销成为自己的测试/方法。而不是每次都创建注销方法,还有另一种方法可以调用该方法吗?

@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 {}

2 个答案:

答案 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
    }
}

希望这会有所帮助。