Как генерировать тестовые данные в соответствии с логическим выражением?

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

 ((a==3000710)||(b==3000700))
   &&(b>=30 && b<=33)
   &&((c==1)||(c>=4 && c<=6))
   &&((v==1.0.9)||(v==2.0.0))

Любые комментарии приветствуются.

Кстати, логическое выражение - это упрощенное правило, которое применяется на нашем внутреннем сервере.

1 ответ

Первое, что я должен сказать - это рефакторинг! Разбейте его на несколько операторов if, которые проще проверить, поменять логику и выйти рано. Трудно дать более подробные предложения, не видя реального кода и контекста.

Другое дело, если (b == 3000700), затем &&(b>=30 && b<=33) возвращает false, что делает эту часть утверждения ||(b==3000700) бессмысленно. Может быть, это должно было быть (a == 3000700)?

Что касается тестовых случаев... Еще раз, не видя полного фрагмента кода и не зная контекста, немного сложно дать содержательные предложения. Но я все равно попробую.

Давайте посмотрим на "критические значения" для каждой переменной.

  • Переменная а: 3000710, любой другой
  • Переменная b: 3000700, [30, 33], any other
  • Переменная c: 1, [4, 6], any other
  • Переменная v: 1.0.9, 2.0.0, any other

Используя теорию тестирования (распределение эквивалентности и анализ граничных значений), мы можем ограничить приведенный выше список "критических" значений.

[30, 33] => 30, 31, 33 (The value outside of this range is already covered by "any other")
[4, 6] => 4, 5, 6 (The value outside of this range is already covered by "any other". Though we did't really change anything in this case)

Nunit имеет атрибут [Combinatorial] который генерирует тестовые случаи для всех возможных комбинаций отдельных элементов данных, предоставленных для параметров теста.

* Допущения: переменные a, b, c имеют тип int, переменную v это строка

Код будет выглядеть примерно так:

        [Test, Combinatorial]        
        public void FirstTest(
            [Values(3000710, 0)] int a, 
            [Values(30, 31, 33, 3000700, 0)] int b,
            [Values(1, 4, 5, 6, 0)] int c, 
            [Values("1.0.9", "2.0.0", "")] string v)
        {
            RunTestMethod(a, b, c, v);
        }

Вам просто нужно сохранить сгенерированные тестовые данные при выполнении теста

Другие вопросы по тегам