c# - Specflow 上下文断言

标签 c# automated-tests assert specflow fluent-assertions

我们使用 Specflow,目前,我们的大部分断言都是使用 Fluent Assertions 完成的,即看起来像:
myval.Should().NotBe(null)

一切正常,但在某些情况下,我们希望相同的代码有时断言不确定,有时则不然。

例如,假设我们有一个调用方法来安装 AUT 的步骤。
断言 AUT 可以正确安装的测试将使用此方法作为 WHEN/THEN 步骤的一部分。
在这种情况下,如果安装失败,我们希望照常进行并使测试失败。
鉴于 AUT 未安装 当我安装 AUT

但是,对于所有其他测试,相同的方法 可以作为 GIVEN 步骤的一部分或作为 BeforeScenario/BeforeFeature Hook 的一部分调用,在这种情况下,如果安装失败,测试应该因不确定而失败,因为失败的不是测试本身,而是设置阶段。 鉴于已安装 AUT 当我执行 AUT 的功能 X 时

所以在这个例子中,让我们假设在第一个测试中 WHEN I install the AUT 的步骤定义,以及在第二个测试中 GIVEN the AUT is installed只需使用类似 AppFacade.Install()

的方法调用辅助方法

当然我们可以乱用 AppFacade.Install() 和我们所有其他带有条件的辅助方法等,但我想知道是否有人有更优雅的解决方案 - 即扩展断言的方法引擎,以便它自动应用此逻辑 - 我认为在 Specflow 方面没有任何障碍可以实现这一点,因为您可以检查 Specflow 上下文对象以检测您正在进行的步骤类型。
理想情况下,我们希望坚持使用 Fluent Assertions,但如果这使事情过于复杂,我们愿意重新考虑。

最佳答案

我的意思是你问的问题不对,因为你是在暗示当 Specflow 步骤执行失败时,测试应该是不确定的,但你已经意识到了。

所以回答你的实际问题:

Is it possible to throw an exception which can mark the test as inconclusive given the above logic?

是的,您可以使用 AfterStep 钩子(Hook)(参见 Specflow 钩子(Hook) here )来检查是否有任何异常抛出并执行 Assert.Inconclusive()如果您正在使用 Nunit 或任何等效方法,例如 SpecflowScenarioContext.Current.Pending()不附加到安装的测试框架,唯一需要注意的是 ScenarioContext.Current.Pending() 不清除 ScenarioContext.TestStatus,因此您的测试运行器将标记它为红色,您必须使用反射来设置 TestStatus 属性,如 here 所述.

它看起来像这样:

[AfterStep]
public void Check()
{
    if (ScenarioContext.Current.TestError is AssertionException &&
        ScenarioContext.Current.CurrentScenarioBlock == ScenarioBlock.Given)
        Assert.Inconclusive(ScenarioContext.Current.TestError.Message);
}

编辑

Here是我创建的演示。

关于c# - Specflow 上下文断言,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43101426/

相关文章:

unit-testing - 使用声明与验证的准则

c# - .Net 2.0 中频繁的文件 I/O 在 Vista 中出现 UnauthorizedAccessException

c# -  字符附加到每个文件的开头

c# - 如何将 ef4 上下文或至少某些实体还原为其原始值?

java - 如何在 appium 的 textview 中点击文本链接

c# - CodedUI 测试未在测试 Controller /代理上运行

c# - 实习字符串是否有助于解析器的性能?

java - 具有 Excel 输入和输出的自动化测试用例

c++ - 我应该在 Assert 失败后返回吗?

c# - 关于 throw 和 assert 的困惑