Как создавать функции в SpecFlow для многозависимых требований - PullRequest
0 голосов
/ 14 июня 2011

Я изучаю SpecFlow и делаю простой стандартный проект FizzBuzz Com-Sci.Учитывая диапазон чисел Замените делимое на 3 с помощью Fizz Замените делимое на 5 с помощью Buzz Замените делимое на 3 и пять на FizzBuzz.

Это очень простое приложение, но оно вызвало у меня вопрос.Как написать функции для тестирования нескольких требований, когда все они запускаются из одного вызова метода в API?Например, вызов API будет выглядеть следующим образом: FizzBuzz.Replace(1, 100); с кодом метода Replace

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

Мои функции в SpecFlow следующие:

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|

Еще один вопрос - как сделатьболее значимым, если мне нужно объединить все требования в одной функции.

Редактировать Я изо всех сил пытаюсь создать несколько сценариев, потому что, как только я создаю второй сценарий, первый отказывает.

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)

, затем выполните следующий сценарий

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)

Второй сценарий пройден, но первый сценарий завершился неудачей.Я не думаю, что открытие API для сценария 1, 2, 3 было бы хорошим дизайном для приложения.

Спасибо,

Ответы [ 2 ]

5 голосов
/ 16 июня 2011

Увидел ваше сообщение в списке рассылки. Если вы хотите разделить тесты Fizz, Buzz и FizzBuzz, вы можете изменить свою спецификацию, чтобы создать сценарий для каждой ветви вашей реализации (т. Е. Каждое «если»):

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       |

Другое наблюдение в вашем примере заключается в том, что ваши ожидания выражаются в таблице (по сути, в массиве), а ваши результаты выражаются в виде строки. Поскольку вы используете SpecFlow для тестирования API в этом примере, я постараюсь выровнять эти два параметра более тесно, изменив спецификацию или ваш API.

Например, рассмотрим следующее изменение API "public static string [] Replace (int min, int max)". Ваши шаги было бы легче написать - что-то вроде этого:

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

НТН, Дэн Морк

0 голосов
/ 14 июня 2011

Когда вы запустите указанную вами спецификацию, specflow предложит вам создать метод, подобный этому:

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

Вы можете перебирать и извлекать значения из вашей таблицы следующим образом:

[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
        }
    }

Что касается того, как сделать ваши тесты более значимыми, я могу сказать, что лично я разбил бы этот тест на различные сценарии. Я бы сделал один сценарий для чисел, которые показаны в виде чисел, другие, разделенные на 3, и еще один, разделенные на 5.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...