我有一个特点,“从外部网站导入文章”。 在我的第一个场景我测试导入的来自外部网站的链接列表。
Feature: Importing articles from external website
Scenario: Searching articles on example.com and return the links
Given there is an Importer
And its URL is "http://example.com"
When we search for "demo"
Then the Importer should return 25 links
And one of the links should be "http://example.com/demo.html"
在我的步骤我有一个25个链接@result
阵列。
在我的第二个场景我想利用其中一个链接,并测试我正确地分析文章的事实。
现在很明显,我不想每次去外部网站,特别是现在的第一个场景通过。
如何继续在这里,所以我可以继续测试,而不使HTTP请求的第一个场景? 或者我应该运行一次,并持续了@result
跨情景的rest数组,所以我可以保持与实际结果集的工作?
这是故意很难做到的! 测试之间共享状态通常是一个非常糟糕的事情,这不仅是因为它迫使你的测试顺序运行(您的第一个场景必须在随后的问题之前运行,不是黄瓜明确支持)。
我的建议是重新考虑你的测试策略。 在测试中击球外部服务是让他们运行缓慢和不可靠的好方法(当外部服务出现故障时会发生什么?)。 在这种情况下,我建议使用类似webmock或VCR创建外部站点,返回相同的响应,你会从真正的网站期待的仿版,但只要你喜欢不,你可以打很多次性能或可用性的担心。
我发现这在技术上是可以使用
@@在步骤定义global_variable共享全局状态。
然而,就像其他人分,这可能不是一个好主意。
我试图避免在类似的情况下重复登录的步骤。 再次,它可能不是一个很好的做法。 当确有必要使用技巧
你不应该情景之间共享状态。 情景描述一张整个系统预期的行为,它应该有可能只运行一个场景。 例如,如果您已运行整个测试套件,你会发现,一个单一的方案失败,你应该能够为了调查出了什么差错运行只是一个场景。
你的问题出现了,因为你尝试联系外部系统。 这是不可取的。 它不仅让你测试套件运行速度比较慢,但它也使测试依赖于外部系统上,对此你无法控制的。 如果外部系统未运行,你的测试没有运行。 如果外部测试不包含所需的数据,你的测试会失败,即使有在自己的系统中没有错误。 你最终让你的测试来控制你所期望能够在外部系统的东西,而不是控制什么的基础上,你需要考什么外部系统。
相反,你应该模拟出的外部系统,让你的场景对照一下嘲笑系统将提供:
Scenario: Query external system
# These two lines setup expected data in a mocked version of the external system
Given there the system x contains an article named "y"
And the article contains the text "Lorep ipsum"
When I query for article "y"
Then I should see the text "Lorem ipsum"
此方案是独立于外部系统的任何实际的数据,因为它明确规定了什么需要存在。 更重要的是,它清楚地描述自己的系统应该如何表现。
在该形式中,场景也可以传达给利益相关者,他们可以验证方案没有任何先验知识以任何存在于这些外部系统的试验数据。
这可能需要一些时间得到一个适当的框架运行,但最终,这将是值得的。
我使用的文件。 我有一个病例,以创建新的用户,那么我想注销并重新登录与其他功能相同的用户。
我生成与用户:
@randomName = [*('a'..'z')].sample(8).join
然后,我保存用户的文件:
File.open("randomName.txt", 'w') {|f| f.write("#{@randomName}") }
后来,当我需要其他功能,数据,我使用:
@randomName = data = File.read("randomName.txt")
制作场景依赖或场景之间共享的数据是不是一个好的做法。
一些解决方案1)黄瓜提供背景标记运行为每个方案的先决条件。
2)黄瓜提供挂钩@Before和@After可定制用于每个场景。