Domanda

Sto imparando SpecFlow e sto facendo un semplice progetto Fizzbuzz standard COM-SCI. Dato un intervallo di numeri Sostituisci divisibile per 3 con Fizz Sostituisci divisibile per 5 con ronzio sostituire divisibile per 3 e cinque con fizzbuzz.

Questa è un'applicazione molto semplice ma mi ha sollevato una domanda. Come scrivere funzionalità per testare più requisiti in cui sono tutti sparati da un metodo Call su un'API? Ad esempio, la chiamata API sarebbe la seguente FizzBuzz.Replace(1, 100);con il codice del metodo di sostituzione

public static string Replace (int min, int max)
{
       if (IsDiv3 && IsDiv5) {...}
       if (IsDiv3) {...}
       if (IsDiv5) {...}
       ...
}

Le mie caratteristiche in SpecFlow sono le seguenti:

Feature: FizzBuzz
    In order to display Fizz Buzz in       range of numbers
    As a user I want to be able to see Fizz Buzz replace certain numbers

Scenario: Replace muliples of three and five with Fizz, Buzz or FizzBuzz
    Given I have a range of numbers from 1 to 15
    When I press Submit
    Then the result should be
    | Numbers   |
    |   1   |
    |   2   |
    |   Fizz    |
    |   4   |
    |   Buzz    |
    |   Fizz    |
    |   7   |
    |   8       |
    |   Fizz    |
    |   Buzz    |
    |   11      |
    |   Fizz    |
    |   13      |
    |   14  |
    |   FizzBuzz|

Un'ulteriore domanda è come rendere la funzione più significativa se ho bisogno di raggruppare tutti i requisiti in una funzionalità.

ModificareSto lottando per creare più scenari perché non appena ne creo un secondo, il primo fallisce.

scenario 1: replace divisable by 3 with Fizz
Expected = 1 2 Fizz 4 5 Fizz 7 8 Fizz 10 11 Fizz 13 14 Fizz
Actual =   1 2 Fizz 4 5 Fizz 7 8 Fizz 10 11 Fizz 13 14 Fizz (First test)
Actual =   1 2 Fizz 4 Buzz Fizz 7 8 Fizz Buzz 11 Fizz 13 14 Fizz (Second test)

Quindi fai lo scenario successivo

Scenario 2: replace divisable by 5 with Buzz
Expected = 1 2 Fizz 4 Buzz Fizz 7 8 Fizz Buzz 11 Fizz 13 14 Fizz
Actual =   1 2 Fizz 4 Buzz Fizz 7 8 Fizz Buzz 11 Fizz 13 14 Fizz (Second test)

Il secondo scenario passa ma il primo ora fallisce. Non penserei di aprire l'API per fare lo scenario 1, 2, 3 sarebbe un buon design per l'app.

Grazie,

È stato utile?

Soluzione

Ho visto il tuo messaggio nella mailing list. Se vuoi dividere la prova di Fizz, Buzz e Fizzbuzz, potresti cambiare le tue specifiche per creare uno scenario per ogni ramo della tua implementazione (cioè ciascuno "if")

Scenario: Replace multiples of three with Fizz
    Given I have a range of numbers from 1 to 4
    When I press Submit
    Then the result should be
    | Numbers    |
    |   1        |
    |   2        |
    |   Fizz     |
    |   4        |

Scenario: Replace multiples of five with Buzz
    Given I have a range of numbers from 4 to 5
    When I press Submit
    Then the result should be
    | Numbers    |
    |   4        |
    |   Buzz     |

Scenario: Replace multiples of three and five with FizzBuzz
    Given I have a range of numbers from 14 to 16
    When I press Submit
    Then the result should be
    | Numbers    |
    |   14       |
    |   FizzBuzz |
    |   16       |

Un'altra osservazione nel tuo esempio è che le tue aspettative sono espresse in una tabella (essenzialmente un array) ma i tuoi risultati sono espressi in una stringa. Dato che stai usando SpecFlow per eseguire i test API in questo esempio, proverei ad allineare questi due più da vicino modificando le specifiche o l'API.

Ad esempio, considera la seguente modifica API "String statica pubblica [] sostituire (int min, int max)". I tuoi passi sarebbero quindi più facili da scrivere - qualcosa del genere:

[Binding]
public class FizzBuzzSteps
{
    private int _min;
    private int _max;
    private string[] _results;

    [Given(@"I have a range of numbers from (\d+) to (\d+)")]
    public void GivenIHaveARangeOfNumbers(int min, int max)
    {
        _min = min;
        _max = max;
    }

    [When(@"I press Submit")]
    public void WhenIPressSubmit()
    {
        _results = FizzBuzz.Replace(_min, _max);
    }

    [Then(@"the result should be")]
    public void ThenTheResultShouldBe(Table table)
    {
        for (var i = 0; i < table.RowCount; i++)
        {
            var expected = table.Rows[i]["Numbers"];
            var actual = _results[i];
            Assert.AreEqual(expected, actual);
        }
    }
}

Hth, Dan Mork

Altri suggerimenti

Quando si esegue le specifiche che hai mostrato, SpecFlow ti suggerisce di creare un metodo come questo:

[Then(@"the result should be")]
    public void ThenTheResultShouldBe(Table table)

Puoi iterare e recuperare i valori dalla tua tabella in questo modo:

[Then(@"the result should be")]
    public void ThenTheResultShouldBe(Table table)
    {
        foreach (var row in table.Rows)
        {
            var numberValue = row["Numbers"]; // the name of the column specified
        }
    }

Come come rendere i tuoi test più significativi, quello che posso dire è che personalmente interromerei questo test in diversi scenari. Farei uno scenario per i numeri che sono mostrati come numeri altri da quelli divisi per 3 e un altro quelli divisi per 5.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top