Пропустить юнит-тест, если CSV-файл не найден - PullRequest
2 голосов
/ 01 июля 2010

У меня есть ряд модульных тестов, которые зависят от наличия файла CSV.Они сгенерируют исключение, если этот файл явно не существует.

Существуют ли какие-либо методы Gallio / MbUnit, которые могут условно пропустить запуск теста?Я использую Gallio 3.1 и использую атрибут CsvData

[Test]
[Timeout(1800)]
[CsvData(FilePath = TestDataFolderPath + "TestData.csv", HasHeader = true)]
public static void CalculateShortfallSingleLifeTest()
{
    .
    .
    .

Спасибо

Ответы [ 4 ]

7 голосов
/ 01 июля 2010

Согласно ответу в на этот вопрос , вам потребуется создать новый TestDecoratorAttribute, который вызывает Assert.Inconclusive, если файл отсутствует.

Assert.Inconclusive очень подходит для вашей ситуации, потому что вы не говорите, что тест пройден или не пройден;вы просто говорите, что это не может быть выполнено в текущем состоянии.

4 голосов
/ 01 июля 2010

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

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

Если это действительно интеграционный тест, вы должны изменить тест так, чтобы вы 'повторное тестирование того, что вы на самом деле хотите протестировать.

Если вы все еще рассматриваете это как модульное тестирование, например, пытаетесь проверить синтаксический анализ CSV, то я бы реорганизовал код, чтобы вы могли имитировать/ stub / подделать фактическое чтение содержимого файла CSV.Таким образом, вы можете легче предоставлять тестовые данные в анализатор CSV и не зависеть от каких-либо внешних файлов.

Например, вы считаете, что:

  • Пакет антивируса может недать вам немедленный доступ к файлу
  • Типичный инструмент для программиста, такой как TortoiseSvn, интегрирует накладки оболочки в Проводник, которые иногда держатся за файлы слишком долго и не всегда дают доступ к файлу программе (выудалил файл и попытался перезаписать его новым? конечно, просто позвольте мне сначала пройти удаление, но есть программа, держащая файл, так что это может занять некоторое время ...)
  • Возможно, файл не существует (почему это так?)
  • Возможно, у вас нет доступа для чтения к пути
  • Возможно, у вас неправильное содержимое файла (из-за более раннего сеанса отладки)?)

Как только вы начнете привлекать внешние системы, такие как файловые системы, сетевые подключения и т. Д., Есть так много вещей, которые могут пойти не так, как надо.у вас есть в основном хрупкий тест.

Мой совет: выясните, что вы пытаетесь проверить (файловая система?Анализатор CSV?) И удалите зависимости, которые противоречат этой цели.

2 голосов
/ 01 июля 2010

Простым способом было бы включить условие if в начале теста, которое просто выполнило бы любой код в тесте, если файл CSV может быть найден.

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

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

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

1 голос
/ 02 июля 2010

В Gallio / MbUnit v3.2 аннотация ContentAttribute и его конкретные производные типы (такие как [CsvData] имеют новый необязательный параметр, который позволяет изменить результат теста по умолчанию в случаеПроизошла ошибка при открытии или чтении источника данных файла (ссылка выпуск 681 ). Синтаксис следующий:

[Test]
[CsvData(..., OutcomeOnFileError = OutcomeOnFileError.Inconclusive)]
public void MyTestMethod()
{
  // ...
}
...