Должно ли это быть "Arrange-Assert-Act-Assert"? - PullRequest
89 голосов
/ 20 июня 2009

Что касается классического тестового шаблона Arrange-Act-Assert , я часто добавляю встречное утверждение, предшествующее Act. Таким образом, я знаю, что проходное утверждение действительно является результатом действия.

Я думаю, что это аналогично красному в красно-зеленом рефакторе, где только если я видел красную полосу в ходе моего тестирования, я знаю, что зеленая полоса означает, что я написал код, который делает разница. Если я напишу прохождение теста, то любой код удовлетворит его; аналогично, что касается Arrange-Assert-Act-Assert, если мое первое утверждение не будет выполнено, я знаю, что любой акт прошел бы до окончательного утверждения - так что на самом деле он ничего не проверял в отношении этого закона.

Ваши тесты следуют этой схеме? Почему или почему нет?

Обновление Разъяснение: первоначальное утверждение по существу противоположно окончательному утверждению. Это не утверждение, что Arrange работал; это утверждение, что закон еще не сработал.

Ответы [ 14 ]

0 голосов
/ 10 апреля 2017

Я использую:

1. Setup
2. Act
3. Assert 
4. Teardown

Потому что чистая настройка очень важна.

0 голосов
/ 26 августа 2015

Если вы действительно хотите протестировать все в примере, попробуйте больше тестов ... например:

public void testIncludes7() throws Exception {
    Range range = new Range(0, 5);
    assertFalse(range.includes(7));
}

public void testIncludes5() throws Exception {
    Range range = new Range(0, 5);
    assertTrue(range.includes(5));
}

public void testIncludes0() throws Exception {
    Range range = new Range(0, 5);
    assertTrue(range.includes(0));
}

public void testEncompassInc7() throws Exception {
    Range range = new Range(0, 5);
    range.encompass(7);
    assertTrue(range.includes(7));
}

public void testEncompassInc5() throws Exception {
    Range range = new Range(0, 5);
    range.encompass(7);
    assertTrue(range.includes(5));
}

public void testEncompassInc0() throws Exception {
    Range range = new Range(0, 5);
    range.encompass(7);
    assertTrue(range.includes(0));
}

Потому что в противном случае вы упускаете так много возможностей для ошибки ... например, после охвата, диапазон только с 7 и т.д. ... Существуют также тесты на длину диапазона (чтобы убедиться, что оно также не охватывает случайное значение), и еще один набор тестов для попытки охватить 5 в диапазоне ... что мы ожидаем - исключение в encompass диапазон, который будет неизменен?

В любом случае, смысл в том, есть ли в акте какие-либо предположения, которые вы хотите проверить, поставить их в свой собственный тест, да?

0 голосов
/ 26 августа 2012

Я не использую этот шаблон, потому что я думаю, что делаю что-то вроде:

Arrange
Assert-Not
Act
Assert

Может быть бессмысленно, потому что, предположительно, вы знаете, что ваша часть Arrange работает правильно, что означает, что все, что находится в части Arrange, должно быть проверено так же хорошо или достаточно просто, чтобы не нуждаться в тестах.

Используя пример вашего ответа:

public void testEncompass() throws Exception {
    Range range = new Range(0, 5);
    assertFalse(range.includes(7)); // <-- Pointless and against DRY if there 
                                    // are unit tests for Range(int, int)
    range.encompass(7);
    assertTrue(range.includes(7));
}
0 голосов
/ 20 июня 2009

Зависит от среды / языка тестирования, но обычно, если что-то в части Arrange завершается неудачно, выдается исключение, и тест не отображает его вместо запуска части Act. Так что нет, я обычно не использую вторую часть Assert.

Кроме того, в случае, если ваша часть Arrange довольно сложна и не всегда выдает исключение, вы можете рассмотреть возможность ее обертывания внутри некоторого метода и написания собственного теста для него, так что вы можете быть уверены, что она не будет ошибка (без исключения).

...