5

我目前正在为一个项目构建一个自动化的功能/验收测试套件,但是我没有很多编写这些类型测试的经验,所以我想获得一些关于正确构建它们的输入。具体来说,我正在使用 Arquillian 的 Graphene 扩展。

例如,假设我有 3 个测试,A、B 和 C。

TestA:测试登录到应用程序中的帐户。因此,如果测试成功,浏览器应该在帐户的主页/信息页面上。

TestB:测试修改帐户密码。这需要登录帐户,然后测试密码更改功能。

TestC:测试修改帐户的电子邮件。这将再次需要登录帐户,然后测试电子邮件更改功能。

如果 TestA 由于登录代码问题而失败,显然 TestB 和 TestC 也应该失败,因为它们需要登录到帐户。

问题:自动化功能/验收测试是否应该重复一个完成测试所验证的过程所必需的过程?在这种情况下,TestB 和 TestC 需要先登录该帐户,然后再执行任何其他操作。每个测试是否应该明确调用类似:

/* ...initial test setup code here */
LoginPage.login(username, password);
assertTrue(onCorrectAccountPage);
AccountModification.changePassword(newPassword);

或者我应该使用某种方式将帐户模拟到测试 B 和 C 可以使用的会话中,以便即使 TestA(实际登录测试)失败,它们也不会失败?

由于这些是用户接受测试,我的想法是他们应该做用户会做的事情并在必要时登录,但我不确定这是否是不必要的重复,应该以不同的方式处理(即,像对待功能,类似于标准单元测试),我想从在这方面有更多经验的人那里获得反馈。

提前致谢。希望我的问题不会太复杂。:)

4

3 回答 3

4

我个人这样做是为了让每个测试用例尽可能多地复制用户的操作,但会删除需要的地方。例如,TestA:登录,进入正确的网站,进入它的管理系统,找到一个用户,并删除部分用户信息(如姓名),TestB:登录,进入正确的网站,进入它是管理系统,找到一个用户,并尝试通过一个按钮完全删除用户。

TestA 和 TestB 最终位于同一页面 - 用户详细信息页面。因此,在测试 A 中,我可以按照用户的操作方式正确完成所有操作,但在测试 B 中,我直接转到该用户的详细信息页面,而不是手动进行正确的导航。为什么?

节省时间,既然测试 A 已经测试过了,为什么我还要在测试 B 中重新进行导航?

请记住,测试不应相互依赖——如果所有三个测试都因您无法登录而失败——这就是重点,您无法登录,因此您无法执行任何其他操作。

将其视为用户。每个测试都有他们自己正在测试的用户可查看的功能,但如果您无法登录,用户将无法看到任何内容或对该功能进行任何操作。如果我无法登录,我就无法更改我的密码或电子邮件 - 所以从逻辑上讲,测试应该以同样的方式失败。

于 2012-05-10T19:22:17.677 回答
3

这实际上是一个针对每个项目的问题,因为这两种方法都是有效的方法,但在不同的情况下,应该更喜欢一种方法。在一个大系统中,我更喜欢从头到尾运行测试用例,无论这重复步骤的频率如何(例如,我为每个测试都登录)。我相信这就是 Arran 已经说过的(+1!)。我通常这样做的原因是因为有时从前一个屏幕继承的状态可能会在以后导致错误,而自动化测试非常适合发现这种情况。然而,有了这些,我确保测试数据对于引导步骤都是有效的,并以最快的解决方案为目标。例如,登录应始终具有正确的用户名和密码,然后在检查登录是否成功时,

话虽如此,您还可以编写在某种功能流中测试多个需求的测试。如果流程中断,则应编写测试以识别整个任务失败的区域。我只会将这个推荐给小型项目,或者如果由于缺乏资源而没有优先考虑测试。例如,运行登录、选择商品、放入购物车、结账和付款的测试将测试所有这些功能,并允许团队修复总体“流程”,而不仅仅是几个可能断开的,错误。然而,我再次认为第一种方法更彻底,但也需要更多时间(但值得经常这样做:))。

由于担心我的答案会变得太长和阻塞,我不会在这里进一步讨论,但是在这方面有很多要谈的,我建议坐下来画出你想要测试的东西在应用程序中,现在和将来。这可能会非常有启发性,并鼓励良好的测试结构和自动化写作实践。希望这会有所帮助,而且时间不会太长:)

于 2012-05-10T22:48:29.313 回答
1

用户验收测试中,您不想模拟,而是尽可能接近最终用户使用系统的方式。

但是,单元测试的口头禅每次测试一个断言可以扩展到验收测试:在 TestA 中,您的验证逻辑是关于断言正确登录:在 TestB 中,您不需要重复此验证,只需断言密码修改已正确处理。

在 JUnit 中,可以使用assumeTrue而不是assertTrue为此目的。所以你的 TestB 会变成:

/* ...initial test setup code here */
LoginPage.login(username, password);
assumeTrue(onCorrectAccountPage);
AccountModification.changePassword(newPassword);

现在,如果假设真失败,则简单地忽略测试。但是,您的 TestA 仍然会失败,告诉您和您的最终用户真正的问题是什么。

于 2012-05-11T07:38:53.920 回答