Модульное тестирование с несколькими входами - PullRequest
3 голосов
/ 11 февраля 2012

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

Обратите внимание на следующее:

У меня есть класс Article, в котором есть коллекция цен. У него есть метод GetCurrentPrice, который определяет текущую цену на основе нескольких правил:

public class Article
{
    public string Id { get; set; }
    public string Description { get; set; }
    public List<Price> Prices { get; set; }

    public Article()
    {
        Prices = new List<Price>();
    }

    public Price GetCurrentPrice()
    {
        if (Prices == null)
            return null;

        return (
            from
            price in Prices

            where

            price.Active &&
            DateTime.Now >= price.Start &&
            DateTime.Now <= price.End

            select price)
            .OrderByDescending(p => p.Type)
            .FirstOrDefault();
    }
}

Перечисление PriceType и Price класс:

public enum PriceType
{
    Normal = 0,
    Action = 1
}

public class Price
{
    public string Id { get; set; }
    public string Description { get; set; }
    public decimal Amount { get; set; }
    public PriceType Type { get; set; }
    public DateTime Start { get; set; }
    public DateTime End { get; set; }
    public bool Active { get; set; }
}

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

Я думаю о модульном тесте, таком как этот (псевдо):

[TestMethod()]
public void GetCurrentPriceTest()
{
    var articles = getTestArticles();
    foreach (var article in articles)
    {
        var price = article.GetCurrentPrice();
        // somehow compare the gotten price to a predefined value
    } 
}
  • Я читал, что «множественные утверждения являются злом», но мне не нужно их проверить все условия здесь? Или мне нужен отдельный блок тест по условию?

  • Как бы я предоставил модульному тесту набор тестовых данных? Должен ли я издеваться над хранилищем? И если эти данные также включают ожидаемые значения?

Ответы [ 4 ]

4 голосов
/ 11 февраля 2012

В этом примере вы не используете репозиторий, поэтому нет необходимости что-либо насмехаться. Что вы можете сделать, это создать несколько модульных тестов для различных возможных входных данных:

[TestMethod]
public void Foo()
{
    // arrange
    var article = new Article();
    // TODO: go ahead and populate the Prices collection with dummy data


    // act
    var actual = article.GetCurrentPrice();

    // assert
    // TODO: assert on the actual price returned by the method
    // depending on what you put in the arrange phase you know
}

и т. Д. Вы можете добавить другие модульные тесты, в которых вы будете изменять только фазы arrange и assert для каждого возможного входа.

2 голосов
/ 11 февраля 2012

Я думаю, вам нужно тестирование данных.В vsts есть атрибут Datasource, с его помощью вы можете отправлять тестовый метод несколько тестовых случаев.Убедитесь, что вы не используете несколько утверждений.Вот одна ссылка MSDN http://msdn.microsoft.com/en-us/library/ms182527.aspx

Надеюсь, это поможет вам.

2 голосов
/ 11 февраля 2012

новый тест для каждого условия запуска и отдельного подтверждения, например:

[Test]
public void GetCurrentPrice_PricesCollection1_ShouldReturnNormalPrice(){...}

[Test]
public void GetCurrentPrice_PricesCollection2_ShouldReturnActionPrice(){...}

, а также тест на границы

для модульных тестов я использую шаблон

MethodName_UsedData_ExpectedResult()
2 голосов
/ 11 февраля 2012

Вам не нужно несколько утверждений. Вам нужно несколько тестов с одним утверждением.

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