Модульное тестирование функции - PullRequest
1 голос
/ 15 июля 2011

Я получил очень интересный вопрос при написании модульного теста.

Можно ли проверить функцию при использовании функции в коде теста?

Например,

Если у меня есть класс List<int>, в котором есть функция с именем Add().

Я хочу протестировать целевой объект списка с двумя int уже внутри: 1 и 2. Теперь я добавляю третье число: 3 и хочу утверждать, что число успешно добавлено. Итак, я написал:

public void TestMethod()
{
     //initialize
     List<int> list = new List<int>();
     list.Add(1);
     list.Add(2);

     //do operation
     list.Add(3);
     Assert.IsTrue(list.Contains(3));
}

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

Есть ли какой-нибудь тест, говорящий, что мы не можем этого сделать?

Спасибо!

Ответы [ 4 ]

4 голосов
/ 15 июля 2011

Функции могут потребовать более одного теста. В этом случае у вас будет функция, которая тестирует только один Add(), а затем ту, что у вас есть выше. Пока оба проходят, вы можете быть (разумно) уверены, что ваши результаты надежны. Однако, если первый тест не пройден, результат второго теста, вероятно, следует игнорировать.

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

2 голосов
/ 15 июля 2011

В таком случае лучше сделать тест более полным. Я мог бы сделать это вместо этого:

public void TestMethod()
{
    //initialize
    List<int> list = new List<int>();
    list.Add(1);
    list.Add(2);

    // Test setup
    Assert.IsTrue(List.Count == 2);
    Assert.IsTrue(List[0] == 1);
    Assert.IsTrue(List[1] == 2);

    //do operation
    list.Add(3);
    Assert.IsTrue(List.Count == 3);
    Assert.IsTrue(List[0] == 1);
    Assert.IsTrue(List[1] == 2);
    Assert.IsTrue(List[2] == 3);
}
0 голосов
/ 15 июля 2011

Я думаю, что это не редкость, чтобы написать метод тестирования, как в вашем примере.Важно то, как мы смотрим на это.

Если наше намерение для TestMethod () состояло в том, чтобы протестировать Add (), мы не должны использовать Add (), чтобы установить предварительное условие вthe test.

Если наше намерение для TestMethod () состояло в том, чтобы проверить взаимодействие / последовательность Add () и Contain (), все должно быть в порядке.

0 голосов
/ 15 июля 2011

Ничто не мешает вам сделать это, однако я не вижу в этом смысла в этом конкретном примере.

Существуют и другие сценарии, в которых он может быть действителен, например, где вы хотите проверить конкретное поведение:

1) Ваш 3-й вызов будет влиять на состояние бита объекта иначе, чем предыдущие, в зависимости от значения передаваемого параметра.

2) Вы ожидаете какого-то особого поведения при использовании того же метода в третий раз, например, 3 недопустимых попытки входа в систему.

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