进行单元测试时,每个案例都趋于简短且独占。但现在我正在用Selenium
编写端到端测试,因此,我有很长的场景,其中包含几个密切相关的步骤,例如:
如果发现任何错误,我没想到其他测试会继续。所以,似乎我应该将所有上述内容放在一个it
块中。但是当然这会让这个块很长,而且我必须设置一个很长的超时,期望很长的完成时间等。
这是一种不好的做法吗?
答案 0 :(得分:3)
我想知道这到底有多久了?对于具有适当等待配置的webdriver bot,理想情况下应该在10s以下,这是可以的。 我想提出一些建议。
隔离,可重复的测试
看来你已经在使用一种有趣的验收测试模式。
在他今年(2017年)工艺会议的演讲中,Dave Farley解释了编写可以重复无限次数的测试的想法,因为每次执行都是以新创建的用户的名义进行的。
这是解决" db恢复问题的有趣方法。问题,我看到许多项目在CI / CD工作流程中受到影响。它不需要恢复。它可以被重新命名为一个共同的状态,但是每个测试都会为所有必需的元素提供一个新的id。例如,测试的第一次运行用userid1234执行,下一次运行用userid1235。
因此,有人可能会说你的方法,包括在你的过程中注册,可以帮助你隔离你的执行。我假设需要权衡的是你需要找出你的基础数据(可能是初始数据库状态的一部分)以及添加的内容。
传统的思想流派将独立测试注册,登录和功能(好吧,天真地独立思考)。需要权衡的是,如果注册失败,则不会再进行任何测试。
链接到关于验收测试的讨论视频:
网页对象
所以,似乎我应该将所有上述内容放在一个单独的块中。
虽然有些人已经认为它过时,但似乎页面对象模式会停留一段时间。你的'它'块不应该真的那么复杂。在你的测试中,你应该基本上找到正在发生的事情的纯英文描述。
it('should deny access with wrong creds', function () {
LoginPage.open();
LoginPage.login('Luo', 'SuperSecretPwd'); // Use better forms of Auth
LoginPage.submit();
expect(LoginPage.flash.getText()).to.contain('Hi Luo!');
});
这个想法基本上是关于如何实现给定页面的任何技术细节(表格与CSS网格等)应该隐藏在这些对象中。 那么你的测试不容易出错,并且只有凡人才能理解。
有关页面对象模式的更多信息:
http://webdriver.io/guide/testrunner/pageobjects.html
https://martinfowler.com/bliki/PageObject.html