Cucumber 断言应该在给定的BDD中执行吗

Cucumber 断言应该在给定的BDD中执行吗,cucumber,bdd,Cucumber,Bdd,在编写自动化功能测试的行为驱动开发风格中,一般认为Givens应该是系统必须处于的先决条件,以便开始测试,什么时候应该执行用户操作,然后应该断言观察到的操作是否与预期的匹配,并相应地失败或通过测试 最近,我的团队也开始在Givens和When中进行断言,这让我怀疑这是否是一种正确的做法 例如: Given a user with xyz privileges is logged in When I click on the abc tab Then records should be displ

在编写自动化功能测试的行为驱动开发风格中,一般认为Givens应该是系统必须处于的先决条件,以便开始测试,什么时候应该执行用户操作,然后应该断言观察到的操作是否与预期的匹配,并相应地失败或通过测试

最近,我的团队也开始在Givens和When中进行断言,这让我怀疑这是否是一种正确的做法

例如:

Given a user with xyz privileges is logged in
When I click on the abc tab
Then records should be displayed
本测试中给出的是实际断言登录用户确实具有xyz权限,还是假定用户具有所需权限并仅执行登录


也应该在单击之前声明该选项卡是可见的吗?

没有严格的规则,但是根据我的经验,我发现可以方便地定义那里没有声明,这样就可以清楚地知道实际测试了什么,并且测试本身将运行得更快

如果未显示abc选项卡,则不应单击该选项卡,然后在确定要单击的对象或执行下一步时(取决于您使用的工具和方法),测试将失败

但是,您应该确保测试的实际实现不是欺骗,也不是使用能够触发单击的内部构件,即使实际组件不是

关于给定的测试还有另一点,通常建议为测试设置环境。这意味着您要确保您的系统中有一个用户,并且该用户已登录。当你设置它时,没有什么意义,但是如果发生任何故障,你应该很快就知道什么是错误的。

如果“登录”是一种有趣的行为*并且你需要例子来说明它**,那么它应该是一个“何时”,它发生的上下文是“给定的”,结果是结果“那么”

这是任何需要举例说明的行为的情况

然而,有时在给定的环境中进行断言是很有用的,只是为了检查上下文是否真的正确设置。有时当人们开始采用BDD时,环境可能会有点不稳定,并且很容易知道是您的场景发现了一个bug导致它失败,还是在过程的早期发生了什么。因此,您可以在那里找不到断言

然而,给定的不关心系统是如何进入那种状态的。如果它有断言,它应该只是检查它是否是

我看到的另一种形式是检查系统是否处于上下文的正确状态,如果没有,则采取纠正措施

请注意,这些基本上都是过渡模式。当团队采用BDD并使其管道和自动化部署成形时,它们会很有帮助

检查“When”结果的断言是结果的一部分,也是“Then”的一部分。我无法想象在没有结果的情况下,你需要检查“When”的结果。如果你有,请给我一个例子

找出你想要达到的目标,然后去做。把点击隐藏在封面下

大多数情况下,自动化场景实际上并不是用来捕捉bug的;它们是活的文档,帮助人们思考他们正在尝试实现什么以及系统已经实现了什么,从而鼓励良好的设计并从一开始就防止bug

我会说“导航到ABC选项卡”之类的话,然后就这么做;如果没有,你会得到一个相关的异常,而这种情况不会像阅读场景的人那样经常发生

*它正在登录。可能没有登录。

**它正在登录。您可能没有。

一般来说,我会小心地在自动化代码中的给定步骤或步骤中使用断言

然而,我在代码中到处都使用这样的登录步骤,因为如果使用正确,可以将该步骤转换为一段上下文,而不是断言本身

例如:

该用户是否已登录

  • 是=>什么都不做
  • 否=>注销,然后以此用户身份登录

在您给出的示例中,我们知道需要特定用户登录才能使此场景正常工作,但是我们不知道是否有其他用户登录(在此之前可能已经运行过其他场景)。如果您使用此步骤作为检查,以确保正确的用户登录(如我的示例中所示),它是上下文的一部分,它将加快自动化的运行时间,因为您不必在每个场景之前登录,也不必在每个场景之后注销。

Givens和When中的断言通常是步骤定义不成熟的一个指标。因此,我可能会在我正在工作的步骤中放置一个,但我不会将其保留太久

我会执行你的步骤

已登录具有xyz权限的用户

差不多

'Given a user with xyz privileges is logged in' do
  user = create_user(privileges: xyz)
  login_as user: user
end
我希望
create\u user
方法会很快被信任,并且不需要断言。与
login\u as
方法相同。(如果这样的方法不能正常工作,您可能会期望许多场景被破坏)


请注意,这段代码清楚地说明了有两件事正在进行,并提供/使用了一个api,您希望许多其他StepDef使用它。以及您可能希望保留的任何断言如何真正属于helper方法而不是step def。

Hi,thanx作为答案:)如果它是测试的断言,会发生什么?(例如,
鉴于此数据集样本
(我怀疑我的同事明年需要更换),
当数据集有工资信息时。
我计算税收,
那么税收应该是正的,并且低于sallary
)在这里,我在
上加了一个断言,当
不是测试程序而是测试我的测试时,@ntg关于Givens的事情是,它不存在