2013-02-05 39 views
1

我一直在研究基於驗收的測試,他們看起來相當不錯,因爲他們更適合基於特徵的開發。如何寫出基於驗收的測試(從代碼角度來看)

問題是我不知道如何將它們放在代碼中。我想盡量避免在另一個框架中處理這個問題,所以我只是尋找一種簡單的方法來啓動和運行這些測試。

我接受任何代碼結構所需的更改。我也在使用規格來建立複雜的驗收標準。

樣品的什麼,我試圖做的:

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)); 
    } 
} 

我可能是完全沒譜在這裏,但基本上,我想能夠運行不同的假設和吉文斯的測試。只要我能指出某人蔘加測試來驗證給定的標準,我不介意是否必須進行更多課程或輕微複製。

+1

這看起來更像是功能測試而不是驗收測試(因爲您正在模擬其他代碼使用您的代碼而不是人類使用您的程序)。它是否正確?請參閱[這個問題](http://en.wikipedia.org/wiki/Aspect-oriented_programming),以便比較各個方面。如果是這樣,您可以使用幾種方法,包括[面向方面](http://en.wikipedia.org/wiki/Aspect-oriented_programming)方法。然而,在接受測試方面,我不是專家,也不會因錯誤地回答您的問題而混淆水域。 –

+0

老實說,我不確定。這個想法是,開發者給了我一個http客戶端的故事,並基於這個故事,我需要根據我們對於期望的討論來完成一些標準。這最終的結果是他得到了他想要的,並且我編碼了期望。我們試圖找到一種方法來開發和測試所需的東西,不多不少。 – deanvmc

+1

PS你的鏈接都轉到同一篇文章。 – deanvmc

回答

1

我強烈建議使用ATDD框架如SpecFlow甚至MSpec來創建這種性質的測試。然後,實施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(); 
    } 
} 
+0

Dammit ...你爲什麼要去提供一個樣本...現在我必須去所有的skunkworks,並試試這個,因爲它看起來很愚蠢酷..這都是你的錯.. – deanvmc

+0

我會說我很抱歉但我真誠地不 - 繼續前進,你會愛上它:) – levelnis

+0

我接受了。它工作得很好,但我發現我們需要坐下來談論我們需要什麼類型的測試以及我們想要什麼樣的測試,所以我可能會問錯誤的問題。然而,當涉及到BDD時,我們將認真研究未來的specflow。乾杯。 – deanvmc

相關問題