У меня есть метод, который имеет много условий в нем:Есть ли более простой способ обработки модульного тестирования методом со слишком многими условиями?
public bool IsLegalSomething(Order order)
{
var item0 = order.Items.SingleOrDefault(x => x.ItemCode == "ItemCode0");
var item1 = order.Items.SingleOrDefault(x => x.ItemCode == "ItemCode1");
...
var itemN = order.Items.SingleOrDefault(x => x.ItemCode == "ItemCodeN");
return ((item0.Status == Status.Open) && (item1.Status == Status.Closed)
&& ...
&& (itemN.Status == Status.Canceled));
}
Я хочу модульное тестирование этой функции, но есть очень много условий, что число единичных испытаний является сумасшедшим, если вы считаете, каждая комбинация. В этом операторе return есть 16 условий, и поскольку каждое условие истинно/ложно, это 2^16 различных комбинаций, которые мне нужно будет проверить. Мне действительно нужно создать 2^16 различных модульных тестов здесь, чтобы гарантировать, что все условия используются? Имейте в виду, это простой пример. Некоторые из моих функций имеют сложные условия в связи с юридическими требованиями:
return (condition0 && condition1 && (condition2 || condition3)
&& (condition4 || (condition5 && condition6)) ...)
По математике некоторых из моих функций, число различных комбинаций, что условия могут производить миллионы! Я изучил тесты с данными (DDUT), а также Parameterized Unit Tests (PUT), но это просто делает так, чтобы модульный тест был «заполнением пробелов». Я все еще должен поставлять все различные комбинации и ожидаемый результат! Например:
// Parameterized Unit Test
[TestCase(..., Result = true)] // Combination 0
[TestCase(..., Result = true)] // Combination 1
[TestCase(..., Result = false)] // Combination 2
public bool GivenInput_IsLegalSomething_ReturnsValidResult(...) { }
Если я использую MSTest тянуть в качестве источника данных (CSV, например), я до сих пор с той же проблемой. У меня слишком много комбинаций, которые дают разные результаты. Есть ли альтернатива, о которой я просто не знаю?
Возможно, дизайн необходимо будет пересмотреть и реорганизовать. Сложность/трудности при создании модульных тестов - это показатель того, насколько чистым является тестируемый код. Проверяемый метод делает слишком много. – Nkosi
@Nkosi, Понятно, но я не совсем уверен, как «упростить» законодательные требования, которые имеют много комбинаций. В конце дня в каком-то классе будет содержаться логика, в которой говорится: «16 условий приводят логическое значение». – michael
@Nkosi - это правильно. –