Настройка выходного файла для тестов методом SetUp - PullRequest
0 голосов
/ 12 октября 2018

Здравствуйте, у меня есть class полный testcase -s Я хочу предварительно установить каждый testcase выходной файл в зависимости от его идентификатора или имени.

class SetTests {
        [SetUp]
        public async Task WriteHeader() {
            TestContext.WriteLine("${something belonging to current test}");
        }

        [TestCase]
        public void WriteContent() {
            TestContext.WriteLine("Myfirst test");
        }
        [TestCase]
        public void WriteAnotherContent() {
            TestContext.WriteLine("mysecond test");
        }
    }

Я хочу свой WriteHeaderметод, который вызывается перед каждым testcase, чтобы установить имя файла текущего теста Output на что-то, что может идентифицировать текущий тест (Methodinfo.Name или любое другое уникальное свойство), и записать это как заголовок в файл.

В моем примере, приведенном выше, я хотел бы после запуска тестов иметь:

WriteContent.txt

//----ID/name/ of test whatever-----
Myfirst test

WriteAnotherContent.txt

//------ID/name/ of test whatever------
  my second test

PS Я сказал whatever, потому что я не знаю, какую metadata информацию можно получить в методе SetUp о тестевот-вот побежит.

1 Ответ

0 голосов
/ 12 октября 2018

Нет способа заставить вывод TestContext.WriteLine перейти в любой файл вообще, потому что он определен как запись в выходной отчет XML, созданный NUnit.То же самое касается Console.WriteLine, который перехватывается NUnit и также включается в вывод XML.

Чтобы ваши тесты могли записываться в другое место, то есть в специальный файл, вы должны открыть этот файл самостоятельно и записать вЭто.Таким образом, проблема двоякая ...

  1. Как определить, в какой файл писать в SetUp.

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

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

NON-ПАРАЛЛЕЛЬНЫЙ ПОДХОД

TestContext.CurrentContext.Test.Name дает название текущего теста.Он доступен в SetUp, TearDown и в самом тесте.Когда тесты выполняются последовательно, SetUp, Test и TearDown запускаются один за другим, и между ними ничего нет.Вы можете установить информацию в полях элементов в SetUp и использовать их в тесте и разборе.

Пример: В SetUp создайте имя файла, создайте его и сохраните TextWriter в поле для использованиятесты.В тесте напишите этому писателю.В TearDown закройте его.

Другой пример: В SetUp создайте средство записи строк (или просто StringBuilder) для хранения вывода.В тесте напишите автору (или добавьте к строителю).В TearDown определите имя файла для использования и запишите все.

ПРИМЕЧАНИЕ. Это не будет работать, если тесты выполняются параллельно. Любая информация, сохраненная в экземпляре, можетбыть перезаписан в любое время другим тестом в том же классе.Чтобы использовать этот подход, вы должны пометить весь прибор (или каждый тест) как [NonParallelizable].

ПАРАЛЛЕЛЬНЫЙ ПОДХОД

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

Lock based on the fixture instance or an object created in the constructor.
    Use test name to get file name
    Open the file for appending
    Write to the file
    Close the file

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

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