Как включить и xUnit, и NUnit в решение, построенное на Azure DevOps Pipelines?

У меня есть решение C #, в котором есть несколько проектов модульных тестов, использующих xUnit, и проект сквозных тестов, использующий NUnit. (Это сделано намеренно и прекрасно, поэтому я был бы признателен, если бы не пытался убедить меня отказаться от одного ради другого, спасибо)

Я использую Azure DevOps Pipeline для создания, тестирования и упаковки своего решения. Это мой тестовый шаг (из azure-pipelines.yml) на данный момент:

- task: DotNetCoreCLI@2
  displayName: 'Run tests in solution'
  inputs:
    command: 'test'
    arguments: '--configuration $(buildConfiguration) --collect "Code coverage" --filter Category!=Integration'
    publishTestResults: true

Когда я запускаю этот конвейер, мой конвейер выходит из строя с этим сообщением об ошибке:

Возникла исключительная ситуация при вызове исполнителя 'Execution: // nunit3testexecutor /': Unexpected Word 'Category' в позиции 29 в выражении выбора.

Я почти уверен, что это происходит потому, что NUnit забирается и не понимает термин фильтра Category. (Вместо этого NUnit ожидает термин TestCategory)

Я попытался заставить конвейер не забирать проект NUnit (называемый EndToEnd) следующим образом:

--filter FullyQualifiedName!~EndToEnd&Category!=Integration'

Но это не работает, и я получаю то же сообщение об ошибке.

Как я могу заставить Azure DevOps Pipelines запускать тесты только в моих проектах xUnit на этом этапе и не давать сбой из-за наличия проекта NUnit?


person urig    schedule 22.09.2020    source источник
comment
Есть ли причина не иметь разные задачи для запуска разных проектов? Просто укажите имя проекта в качестве аргумента командной строки.   -  person Jon Skeet    schedule 22.09.2020
comment
Боже @JonSkeet! Мне жаль. Ничего не могу поделать :) Не уверен, что понимаю. Да, я думаю один шаг для UT, другой для E2E, но это несколько проектов модульных тестов и один проект E2E. Пытаюсь понять, как исключить E2E из шага UT.   -  person urig    schedule 22.09.2020
comment
Похоже, я его взломал. Все мои проекты UT называются Foo.Tests.csproj, но мой проект E2E называется просто EndToEnd. Я добавил эту строку к шагу, и она сработала: projects: '**/*.Tests.csproj'. Я думаю, что еще лучшим решением может быть: projects: !'**/*.EndToEnd.csproj'   -  person urig    schedule 22.09.2020


Ответы (1)


Вы можете использовать projects для выбора проектов. Я протестировал это с этим решением, и оно работает:  введите описание изображения здесь

variables:
  buildConfiguration: 'Release'
  rootDirectory: '$(Build.SourcesDirectory)/stackoverflow/69-nunit-and-xunit'

steps:

- task: DotNetCoreCLI@2
  displayName: Restore nuget packages
  inputs:
    command: restore
    projects: '**/*.csproj'
    workingDirectory: $(rootDirectory)

- task: DotNetCoreCLI@2
  displayName: Test xUnit
  inputs:
    command: test
    projects: '$(rootDirectory)/**/*XUnit.csproj'
    arguments: '--configuration $(buildConfiguration)'

- task: DotNetCoreCLI@2
  displayName: Test NUnit
  inputs:
    command: test
    projects: '$(rootDirectory)/**/*NUnit.csproj'
    arguments: '--configuration $(buildConfiguration)'
person Krzysztof Madej    schedule 22.09.2020