Может ли быть несколько утверждений в одном тесте?

Вчера я начал смотреть на FsCheck и пытаюсь написать простой тест, что любой экземпляр DiscountAmount всегда будет иметь отрицательное значение. Мой вопрос в том, можно ли иметь несколько утверждений в одном тесте. Например, здесь я говорю, что сумма, из которой создана DiscountAmount, плюс сумма скидки должна быть равна 0. Но я также говорю, что сумма скидки должна быть меньше 0. Должно ли это быть 2 теста или 1?

    public class DiscountAmountTests
    {
        [Property()]
        public void value_or_created_discountAmount_should_be_negative()
        {
            Arb.Register<AmountArbitrary>();
            Prop.ForAll<Amount>(
                v =>
                {
                    var sut = new DiscountAmount(v);
                    var expectedResult = 0;
                    var result = v + sut;

                    result.Should().Be(expectedResult);

                    sut.Value.Should().BeLessThan(0);

                })
                .QuickCheckThrowOnFailure();
        }

        public class AmountArbitrary
        {
            public static Arbitrary<Amount> Amounts()
            {
                return Arb.Generate<decimal>().Where(x => x > 0)
                    .Select(x => new Amount(x))
                    .ToArbitrary();
            }
        }

    }
}

person epitka    schedule 10.03.2017    source источник
comment
Хотя в основном это мнение, наличие нескольких утверждений, ориентированных на конкретный тестовый пример, не должно быть проблемой.   -  person Nkosi    schedule 10.03.2017


Ответы (1)


Я бы сказал, что это действительно зависит от вас. Я думаю, что есть аргументы за и против - с одной стороны, иногда стоимость установки высока (будь то с точки зрения работы программиста, чтобы привести систему в определенное состояние, или действительно вычислить стоимость ресурсов, например, вам нужно выполнить дорогой запрос к БД что ли) и тогда на мой взгляд стоит сделать тесты более крупнозернистыми.

Компромисс заключается в том, что, как правило, менее ясно, в чем проблема, если грубый тест терпит неудачу.

По сравнению с модульными тестами FsCheck требует немного больше затрат на настройку с точки зрения генерации аргументов, и привлекательно сделать тесты FsCheck более крупнозернистыми, чем модульные тесты. Также обратите внимание, что у FsCheck есть такие методы, как Label, And. Or, чтобы объединить различные свойства вместе при совместном создании аргументов, и при этом позволить вам увидеть, какая часть вашего теста терпит неудачу, несколько компенсируя один недостаток.

person Kurt Schelfthout    schedule 13.03.2017