0

我想为我班级的构造函数做一个非常简单的测试,

[Test]
public void InitLensShadingPluginTest()
{
    _lensShadingStory.WithScenario("Init Lens Shading plug-in")
        .Given(InitLensShadingPlugin)
        .When(Nothing)
        .Then(PluginIsCreated)
        .Execute();
}

这可以在 Given 或 When it 中...我认为它应该在 When() 中,但这并不重要。

private void InitLensShadingPlugin()
{
    _plugin = new LSCPlugin(_imagesDatabaseProvider, n_iExternalToolImageViewerControl);
}

When()由于构造函数是被测试的,我在语句中没有任何事情要做,

Then()我断言插件创建时。

private void PluginIsCreated()
{
    Assert.NotNull(_plugin);
}

我的问题是关于 StoryQ,因为我不想在我尝试使用的 When() 中做任何事情,When(()=>{})但是 storyQ 不支持,这意味着我需要实现类似的东西

private void Nothing()
{
}

并打电话When(Nothing)

有更好的做法吗?

4

1 回答 1

1

奇怪的是 StoryQ 不支持遗漏步骤;您的场景实际上是我用来启动应用程序、游戏等的其他示例的典型:

Given the chess program is running
Then the pieces should be in the starting positions

例如。因此,您希望使用条件后跟结果的愿望是完全有效的。

查看 StoryQ 的 API,它似乎不支持这些空步骤。您始终可以创建自己的方法并在其中调用 Given 和 When 步骤,从 When 返回操作:

    .GivenIStartedWith(InitLensShadingPlugin)
    .Then(PluginIsCreated)

如果这看起来太笨重,我会按照你的建议做,并将 Given 移动到 When,用一个更有意义的名称的空方法初始化 Given:

    Given(NothingIsInitializedYet)
    .When(InitLensShadingPlugin)
    .Then(PluginIsCreated)

这些中的任何一个都可以解决您的问题。

但是,如果您要测试的只是一个类,而不是整个应用程序,那么使用 StoryQ 可能是矫枉过正。StoryQ、Cucumber、JBehave 等自然语言 BDD 框架旨在帮助业务和开发团队协作探索需求。它们会产生大量的设置和维护开销,因此如果您的课程级场景/示例的受众是技术人员,那么可能会有更简单的方法。

对于类级别的行为示例,我只会使用简单的单元测试工具,如 NUnit 或 MSpec。我喜欢使用 NUnit 并将我的“Given / When / Then”放在评论中:

// Given I initialized the lens shading plugin on startup
_plugin = new LSCPlugin(_imagesDatabaseProvider, n_iExternalToolImageViewerControl);    

// Then the plugin should have been created
Assert.NotNull(_plugin);

类级别的步骤不像在全系统场景中那样重用,因为类具有更小、更封装的职责;开发人员可以从阅读代码中受益,而不是将其隐藏在步骤定义中。

如果该类直接驱动用户看到的功能,那么您在此处的 Given/When/Then 注释可能仍会在更高级别呼应场景。

通常对于全系统场景,我们会从与“3 位朋友”的对话中得出步骤:

  • 业务代表(PO、SME、有问题要解决的人)
  • 测试人员(发现我们可能会错过的场景)
  • 开发人员(谁来解决问题)。

可能有一对开发者。如果他们愿意,UI 设计师可以参与其中。Matt Wynne说它是“3 个朋友,其中 3 是 3 到 7 之间的任何数字”。进行对话的最佳时间是在开发人员开始编写工作之前。

但是,如果您自己工作,无论是玩具还是真正的应用程序,您都可能会从想象中的对话中受益。我用一个叫蓟的小精灵来做我的。

于 2018-01-18T23:31:53.777 回答