如何编写基于验收的测试(从代码的角度来看)

Posted

技术标签:

【中文标题】如何编写基于验收的测试(从代码的角度来看)【英文标题】:How to write out acceptance based tests (from a code point of view) 【发布时间】:2013-02-05 13:17:51 【问题描述】:

我一直在研究基于验收的测试,它们看起来很不错,因为它们更自然地适合基于特性的开发。

问题是我不知道如何在代码中布置它们。我想尽量避免引入另一个框架来处理这个问题,所以我只是在寻找一种简单的方法来启动和运行这些测试。

我对代码结构所需的任何更改持开放态度。我还使用规范来建立复杂的验收标准。

我正在尝试做的示例:

public class When_a_get_request_is_created

    private readonly IHttpRequest _request;

    public When_a_get_request_is_created()
    
        _request = new HttpRequest();
    

    // How to call this?
    public void Given_the_method_assigned_is_get()
    
        _request = _request.AsGet();
    

    // What about this?
    public void Given_the_method_assigned_is_not_get()
    
        _request = _request.AsPost();
    

    // It would be great to test different assumptions.
    public void Assuming_default_headers_have_been_added()
    
        _request = _request.WithDefaultHeaders();
    

    [Fact]
    public void It_Should_Satisfy_RequestIsGetSpec()
    
        Assert.True(new RequestUsesGetMethodSpec().IsSatisfiedBy(_request));
    

我在这里可能完全不合时宜,但基本上我希望能够在不同的假设和假设下运行测试。我不介意是否必须进行更多课程或少量重复,只要我可以将某人指向测试以验证给定标准。

【问题讨论】:

这看起来更像是功能测试而不是验收测试(因为您正在模拟其他代码对您的代码的使用,而不是人类对您的程序的使用)。它是否正确?请参阅this question 以获得对每个的良好比较。如果是这样,您可以使用多种方法,包括aspect-oriented 方法。但是,在验收测试方面,我不是专家,也不想因错误回答您的问题而搅浑水。 老实说我不确定。这个想法是,开发人员给了我一个 http 客户端的故事,基于这个故事,我需要根据我们对期望的讨论来满足一些标准。这样做的最终结果是他得到了他想要的,而我对期望进行了编码。我们正在努力寻找一种方法,只开发和测试需要的东西,不多不少。 PS 你的链接都指向同一篇文章。 这绝对是基于Gherkin 的验收测试框架的候选者,例如SpecFlow。我知道您说过您不想添加框架,但这正是它们的设计目的 我担心会增加另一个级别的复杂性并获得批准。如果没有框架就无法完成,老实说,我会质疑该模式的有效性。不幸的是,我必须在雇主提供的范围内工作,并为尚未得到证实(在我们这边)的测试方式添加更多依赖项,这种情况不会发生。这可能是未来的一个选择,所以我也会看看 specflow。 【参考方案1】:

我强烈建议使用像SpecFlow 甚至MSpec 这样的ATDD 框架来创建这种性质的测试。实现SpecFlow 就是使用特定领域的语言编写规范,如果合适的话,与领域专家合作,然后通过代码满足功能中定义的场景步骤。如果不了解更多关于您的确切要求,很难填充代码方面,但示例功能可能如下所示:

Feature: HTTP Requests
    In order to validate that HTTP requests use the correct methods
    As a client application
    I want specific requests to use specific methods

Scenario Outline: Making HTTP Requests
    Given I am making a request
    When the method assigned is <Method>
    And the <Header> header is sent
    Then it should satisfy the requirement for a <Method> request

Examples:
| Method | Header   |
| Get    | Header 1 |
| Get    | Header 2 |
| Get    | Header 3 |
| Post   | Header 1 |

然后在绑定到功能的步骤中,您可以编写满足规范步骤的代码。这是一个例子:

[Binding]
public class HttpRequestSteps

    [When(@"the method assigned is (.*)")]
    public void WhenTheMethodAssignedIs(string method)
    
        // not sure what this should be returning, but you can store it in ScenarioContext and retrieve it in a later step binding by casting back based on key
        // e.g. var request = (HttpRequest)ScenarioContext.Current["Request"]
        ScenarioContent.Current["Request"] = _request.AsGet();
    

【讨论】:

该死...你为什么要去提供样品...现在我必须去所有的臭鼬工厂尝试一下,因为它看起来很酷..这都是你的错..跨度> 我很抱歉,但我真的不 - 继续吧,你会喜欢的 :) 我接受了。它工作得非常好,但我发现我们需要坐下来谈谈我们需要什么样的测试以及我们想要从中得到什么,所以我可能问错了问题。然而,当谈到 BDD 时,我们将在未来认真研究 specflow。干杯。

以上是关于如何编写基于验收的测试(从代码的角度来看)的主要内容,如果未能解决你的问题,请参考以下文章

如何编写验收测试

如何使用 NServiceBus 验收测试从 saga 处理程序获取反馈

如何编写单元测试-基于Spring

在干净的架构中,如何进行验收测试?

如何使用 selenium 和 codeception 检测验收测试中的 dom 变化

软件测试的分类&测试用例的设计&如何编写测试用例