2016-12-14 125 views

回答

0

我会假设你可以在上述场景之后访问数据库中的PIN码。既然如此,我会在获得并确认PIN确实生成的场景中增加一步。此时,您可以将PIN存储在本地变量中,然后在下一个场景中使用它。

所以,你的第一个场景是这样的:

Get generate PIN page 
Enter user name 
Enter password 
Click on submit button 
Confirm PIN number in database 

最后一步不会被内硒完成,但通过API调用或一些其他手段获取从数据库中的PIN码。它会确认PIN(例如:regex=/^\d{4}$/),然后将其存储在局部变量中,比如@customer_pin(假设您使用的是Ruby)。

你的下一个情景就开始是这样的:

Get generate login page 
Enter customer ID 
Enter customer PIN 
etc 

当你点击“输入客户PIN”的步骤,你在本地存储的变量(@customer_pin)拉出。

我的建议是,在执行第二种情况时,您确认在本地存储的变量中有合法的PIN,以防某人按顺序运行此场景。您可以通过使用全局变量,并在您features/support/env.rb文件中运行“前”挂钩这样做:

Before do 
    $dunit ||= false 
    return if $dunit 
    $customer_pin = nil 
    $dunit = true 
end 

在这种情况下,我为了使全局变量来访问使用$customer_pin代替@customer_pin。然后,在运行第一个场景后,$customer_pin将被分配到一个合法值,以便可以在任何后续场景中使用它。后续场景将使用正则表达式来确认它具有合法值,如果不是,则引发/抛出异常。

+0

您的建议是基于场景的执行顺序并依赖于场景的成功。我会建议不要假设执行顺序,并期望从其他场景获得成功。这是众所周知的反模式。 –

+0

总的来说,我同意,但像生活中的大多数事情一样......这取决于。上述案例可能是打破编程模式的良好借口的糟糕例子,因此您的关注很受欢迎。但有时候我会本着大好事的精神破除模式。例如,将较小的测试作为垫脚石进行较大的测试可能比为每个测试重复背景设置更有利并且侵入性更小。 –

0

我会将你的问题分成两部分。

因为这可能对您的利益相关者非常重要。

一个实现后门以支持需要有效PIN的其他情况。也许一个能够生成或检索有效PIN码的API。也许可以在不接触外部系统的情况下创建PIN并将其存储在数据库中。我会用这种方式来检索PIN码,只要我需要一个有效的PIN码用于其他场景。

关于如何获取有效PIN码的技术解决方案并不太重要。重要的是分离场景的执行顺序。场景的执行顺序未定义。每个场景都必须能够以独立和随机的顺序执行。

耦合场景是众所周知的反模式herehere