Доброго времени суток, коллеги!
Как мы все прекрасно знаем (или не все), поддержка и разработка Allure порта под C# не особо продвигается, за исключением энтузиастов вроде @unickq.
Я столкнулся со следующими проблемами/неудобствами в аллюре на C#:
- Невозможность добавления шагов/аттачей в
[SetUp]
и[TearDown]
методах. - Отсутствие нормальной возможности указания собственных:
- Suite (самое неприятное)
- SubSuite
- Owner
- Epic Suite
- Parent Suite
-
При выполнении действий в других потоках в рамках одного теста - allure падает с исключением.
Т.е. если вы сделаете нечто подобное
Task.Run( () => someMethod());
и внутри данного метода будет вызвано логирование аллюр - выбросится исключениеNullReferenceException
. -
Отсутствие проигнорированных тест-кейсов/тестов в отчётах. (Кейсы, у которых прописано
TestCaseData.Ignore(string)
.
Для меня это оказалось критично, т.к. если мы не смогли найти подходящие тестовые данные из БД для кейса, он должен об этом кричать в отчете, а не отсутствовать там. -
Отсутствие нормального AddAttachment метода, который форматировал бы string в читабельный вид с отступами (json/xml).
Было что-то ещё, но оно не столь критичное, сейчас я уже не вспомню.
Я взял за основу проект https://github.com/unickq/allure-csharp-fork и добавил в него всю необходимую функциональность.
Переработанный мною C# allure имеет функциональность только для классического NUnit.
Если вы используете SpecFlow - не устанавливайте этот пакет, в нём нет ничего относящегося к SpecFlow, у вас всё сломается!
В будущем я добавлю нововведения для SpecFlow и сам SpecFlow, если это вообще кому-то будет нужно, кроме меня
Итак…
Представляю вашему вниманию nuget пакет с переработанным C# Allure под классический NUnit: NuGet Gallery | Noksa.NUnit.Allure 3.2.0
Некоторые методы я видоизменил, поэтому возможно придётся немного изменить их старую сигнатуру переходя с классического аллюра. Но это не точно.
Кратко, как использовать данный allure и его некоторые новые фишки:
-
ГЛАВНОЕ: Для включения логирования - необходимо унаследовать класс
Allure.Commons.AllureReport
базовым классом ваших тестов. Не нужно у каждого класса/метода писать какие-либо allure атрибуты:
public abstract class ABaseTestConfig : AllureReport
Либо непосредственно каждый класс с тестами, если базового нет.
- Для использования своего названия Suite, нужно добавить атрибут
[AllureSuiteAttribute]
у класса:
[AllureSuite(LoginPassNotExists)]
public partial class MyTests: ABaseApiTestConfig
Внутри класса у методов можно использовать атрибут [AllureSubSuiteAttribute]
, для разделения на более мелкие Suite’s внутри одной большой [AllureSuiteAttribute]
:
- Для указания Epic Story для всего класса следует использовать атрибут
[AllureEpicAttribute]
:
[AllureEpic("Epic story")]
public partial class MyTests: ABaseApiTestConfig
Соответственно, если в таком классе будут методы с атрибутами [AllureStoryAttribute]
, все они будут дочерними в следующем порядке:
Epic → Feature > Story.
[AllureStory("С авторизацией")]
[AllureStory("Hey hey")]
public void Test()
Пример каскадности Story
-
Атрибут
[AllureOwnerAttribute]
- устанавливает Owner’a теста\тест-кейса. -
Если у метода указаны атрибуты
[AllureIssueAttribute]
, то в отчете в Suite класса добавится ещё один SubSuite с названием “With Defects”, где будет список тестов/кейсов класса, в которых этот атрибут присутствует.
Сделано для быстрого поиска тестов с дефектами в указанных классах.
В Story не добавляется, т.к. не вижу смысла в дублировании пока что:
-
Аналогично дефектам из 5 пункта, в Suite класса будут добавлены все проигнорированные тесты/кейсы этого класса (для этого ничего указывать не надо).
-
Сам игнорированный тест имеет в отчете указанную причину, по которой это произошло:
- Добавлена перегрузка метода
AddAttachment()
Выглядит так:
public AllureLifecycle AddAttachment(string name, AttachFormat type, string content, string fileExtension = "")
Используется для добавления отформатированных аттачей (xml/json), чтобы они выглядели читабельно, а не в одну строку:
- Соответственно, теперь можно использовать добавление шагов/атачей в
[SetUp]
и[TearDown]
методах.
Пример Setup:
[SetUp]
public virtual void Setup()
{
AllureLifecycle.Instance.AddAttachment($"Screenshot [{DateTime.Now:HH:mm:ss}]",
"image/png",
Driver.TakeScreenshot().AsByteArray);
...
}
-
- Возможность использования потоков внутри одного теста для логирования в аллюр.
Например:Task.Run( () => someMethod());
Данный метод будет иметь начальным шагом не текущий шаг главного потока, а рутовый шаг отчета.
Если вы в этом методе будете создавать steps с substeps - они будут создаваться корректно, внутри steps своего потока.
- Возможность использования потоков внутри одного теста для логирования в аллюр.
Итд…
Если возникнут проблемы/вопросы, пишите, буду рад помочь.
Это мой первый опыт выкладывания чего-либо в opensource, поэтому прошу отнестись с пониманием, если я где-то мог накосячить с пакетом
Так же я не очень долго обкатывал новые атрибуты, поэтому если есть желающие быть бета-тестерами - велком
Из известных проблем сейчас:
- В отчет попадают все проигнорированные тест-кейсы из тестового класса, даже если вы запускали только один тест в нём.