我有一个rails-app,我正在尝试更快地制作我的黄瓜/水豚/ selenium-webdriver测试。我的大部分场景都是:
@javascript
Feature: Writing reports
In order .....
Background:
Given I am logged in
Scenario: Scenario 1
...........
Scenario: Scenario 2
...........
大部分时间花在“我已登录”上,然后我转到注册页面创建用户并登录。使用Devise实现身份验证。
我怎样才能让我根本不需要在测试环境中登录?
是否有其他最佳做法可以解决繁琐的登录步骤?(并且只保留登录,以便专门测试登录/注册的场景)< / p>
答案 0 :(得分:3)
您的黄瓜情景是您的生活和呼吸文件。如果您需要登录才能使用应用程序的那一部分,那么您的黄瓜步骤应明确说明。
至于你在Capybara引擎盖下的所谓。您可以查看设计会话控制器,并在集成测试中直接使用相同的方法调用。但是,如果Devise更改了它的实现,那么集成测试将会中断。 您的集成测试应尽可能不涉及任何底层实施细节。
最简单的维护代码和最可靠的测试将是用户填写表单。
答案 1 :(得分:1)
您的方案中有很多UI deails。这使得很难理解您确实在验证哪种行为。
方案名称提供了一些提示,但Given / When / Then中的具体示例包含许多模糊目的的细节。
Scenario: Login with invalid username/password
Given I am signed out
When I log in with invalid user credentials
Then should I get an error message
Scenario: Login with valid username/password and valid PIN
Given I am signed out
When I log in with valid credentials
then should I be greeted
这两个示例不包含有关链接或引脚形式的任何详细信息。我将这些作为实现细节,我将在堆栈中下推。我会将它们推送到步骤正在使用的辅助类。您似乎正在验证Web应用程序,我会将这些详细信息放在支持这些步骤的页面对象中。
我还会考虑删除个人代词I
的用法,并将其更改为角色。对于系统用户而言典型的角色。角色有一个名字。假设我们创造了一个名为“Ann&#39;谁是一名在行政部门工作的35岁女性。这将使我有机会将场景重写为
Scenario: Login with invalid username/password
Given Ann am signed out
When Ann log in with invalid user credentials
Then will she receive an error message
Scenario: Login with valid username/password and valid PIN
Given Ann am signed out
When Ann log in with valid credentials
then should Ann be greeted
这给了我们一些背景,我们知道Ann是谁。我们可以在支持类中保留她的用户名和密码,并期望实现正确使用它们。
答案 2 :(得分:0)
如果您使用Warden(运行Devise),可以查看http://blog.crowdint.com/2012/11/02/using-warden-to-login-logout-within-your-cucumber-tests.html。
作者提出了一种使用Warden助手而不是填写表格的方法。基本上使用纯Ruby而不是通过浏览器登录。对于专门测试登录/注销功能的方案,您仍然会测试填写各个字段,但这可能会加快您的其他情况。
答案 3 :(得分:0)
不要为用户注册。只需User.create!
作为Given步骤的一部分。并且只能通过网络用户界面签名。
尽可能避免使用@javascript
。这样您就可以使用设计测试助手sign_in
,而不是通过Web UI。
使用更快的javascript驱动程序。例如,在撰写本文时,poltergeist的运行速度是我机器上Firefox的两倍。