1

我已经设置了一个使用 testNG / Maven / Springs RestTemplate 测试 HTTP REST 应用程序的项目。

我用它来进行功能测试,对 REST 应用程序的多次调用包含在套件中以模拟用户流程。

这工作正常。

知道我们已经打开了身份验证。

问题是如何用 testNG 做到这一点?我如何(仅一次)登录我的测试套件。

我可以使用@BeforeSuite 并调用登录页面、登录并捕获所有其他请求所需的cookie。但是我在哪里存储这个 cookie 以便所有测试用例都可以添加它?当然,我可能必须在测试中添加一些代码来添加 cookie....但是我该如何掌握呢?

我查看了@parameter 和@dataprovider,但这些似乎对我没有多大帮助......

非常感谢任何帮助/建议。

4

3 回答 3

0

我创建了一个可行的解决方案。

我所做的是使用单例对象和@dataprovider,以获取数据进行测试:dataprovider 创建一个单例对象。单例对象在其创建过程中调用登录页面,并在每次来自不同测试的调用后返回 cookie 信息。

也许这有点像黑客,但它确实有效。

于 2012-12-16T21:01:36.203 回答
0

Singleton 解决方案有些笨拙,因为它阻止了将来的任何测试并行化。

有一些方法可以解决这个问题。一种是将 ITestContext 实例传递给您的 @BeforeSuite/@BeforeTest 和 @BeforeClass 配置方法,并通过每个实例中的测试上下文放置/获取参数:

public class Test {

    /** Property Foo is set once per Suite */
    protected String foo;

    /** Property Foo is set once per Test */
    protected String bar;

    /**
     * As this method is executed only once for all inheriting instances before the test     suite starts this method puts
     * any configuration/resources needed by test implementations into the test context.
     *
     * @param context test context for storing test conf data
     */
    @BeforeSuite
    public void beforeSuite(ITestContext context) {
        context.setAttribute("foo", "I was set in @BeforeSuite");
    }

    /**   
     * As this method is executed only once for all inheriting instances before the test starts this method puts any
     * configuration/resources needed by test implementations into the test context.
     *
     * @param context test context for storing test conf data
     */
    @BeforeTest(alwaysRun = true)
    public void beforeTest(ITestContext context) {
        context.setAttribute("bar", "I was set in @BeforeTest");
    }

    /**
     * This method is run before the first method of a test instance is started and gets all required configuration from
     * the test context.
     *
     * @param context test context to retrieve conf data from.
     */
    @BeforeClass
    public void beforeClass(ITestContext context) {
        foo = (String) context.getAttribute("foo");
        bar = (String) context.getAttribute("bar");

    }
}

即使 @BeforeSuite/Test/Class 方法位于实际测试实现的超类中,此解决方案也有效。

于 2012-12-17T09:34:21.440 回答
0

如果您委托登录Spring Security并且您的后端不存储状态(意味着只授权孤立的请求),那么您不需要测试它。这意味着您可以在测试中禁用身份验证(cookie 获取)。这样您就可以将测试本身与授权分离。

但如果你不想这样做。如果你在套件中组织你的测试,你可以设置一个私人成员。cookie 将header auth在响应中。

@TestSuite
public void mySuite {

    private String cookie;

    @BeforeSuite public void login() {
         // Obtain cookie
         this.cookie = cookie;
    }
 ////// Rest of suite

另一种看待它的方法是执行登录作为测试的一部分。

我不知道还有其他更优雅的方式来做到这一点。

于 2012-12-15T23:20:50.890 回答