Azure DevOps Pipeline: создание и тестирование отдельных проектов .NET в одном решении

В Azure DevOps у меня есть организация с двумя проектами .NET: «MyProject» и «MyProject.Tests». Оба проекта относятся к одному и тому же решению. Я создаю конвейер, и файл YAML находится в «MyProject». Приведенный ниже фрагмент кода из этого файла YAML предназначен для создания «MyProject», а затем запуска тестов из «MyProject.Tests».

jobs:
- job: Build and Test
  displayName: Build and Test
  steps:
  - task: DotNetCoreCLI@2
    inputs:
      command: 'build'
      projects: '**/MyProject.csproj'
  - task: DotNetCoreCLI@2
    inputs:
      command: 'test'
      projects: '**/MyProject.Tests.csproj'

Задача сборки (DotNetCoreCLI@2 с командой сборки) отлично работает для «MyProject.csproj», но задача тестирования (DotNetCoreCLI@2 с командой тестирования) не может найти «MyProject.Tests.csproj» (я знаю, что '**/ MyProject.Tests.csproj» — неправильный путь). Как я могу изменить свой файл YAML, чтобы он правильно ссылался и запускал модульные тесты из «MyProject.Tests.csproj» после создания «MyProject.csproj»?

Дополнительные детали:

  • Оба проекта (MyProject и MyProject.Tests) являются частью одного и того же решения.
  • Я использую NUnit для модульного тестирования в MyProject.Tests.
  • YAML-файл конвейера находится в корневом каталоге MyProject.
  • Цель состоит в том, чтобы сначала собрать MyProject, а затем запустить модульные тесты из MyProject.Tests с помощью конвейера Azure DevOps. Мы будем очень признательны за любые идеи или исправления о том, как структурировать файл YAML или правильно ссылаться на тестовый проект!

Файловая структура "MyProject"

Файловая структура MyProject.Tests

Почему бы вам не разместить файл yaml вне обоих проектов рядом с файлом .sln. Тогда вам даже не потребуется указывать директиву project или просто широкую карточку **/*.csproj для обоих случаев.

quyentho 06.04.2024 08:55

@quyentho, спасибо за совет. файлы .sln и YAML размещаются на одном уровне в проекте MyProject. там есть путь к тестовому проекту, который выглядит следующим образом: ..\MyProject.Tests\MyProject.Tests.csproj, но на самом деле он не работает. какие-либо предложения?

StanSm789 08.04.2024 01:30

Вы пытались удалить директиву project? потому что команда dotnet test будет использовать csproj/sln для поиска csproject, необходимого для запуска сборки и тестов.

quyentho 08.04.2024 04:25

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

Kevin Lu-MSFT 08.04.2024 04:59

@quyentho, хотя команда dotnet test работает локально, при запуске конвейера без директивы проекта у меня возникает следующая ошибка: ##[ошибка]Ошибка: процесс «C:\Program Files\dotnet\dotnet.exe» завершился с ошибкой с кодом завершения 1 ##[предупреждение]Файлы с результатами теста не найдены.

StanSm789 08.04.2024 08:59

@ StanSm789 StanSm789 Директива проекта необходима при использовании тестовой задачи dotnet. Или он не найдет правильный файл тестового проекта для запуска теста. Вам необходимо убедиться, что MyProject.Tests.csproj можно найти с помощью тестовой задачи dotnet.

Kevin Lu-MSFT 09.04.2024 04:31
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
6
356
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В Azure DevOps Pipeline все файлы проекта будут извлечены в исходную папку: $(Build.sourcesdirectory) по умолчанию.

Чтобы убедиться, что MyProject.Tests.csproj можно найти правильно, вы можете указать следующий путь к тестовой задаче dotnet. projects: '$(build.sourcesdirectory)/**/MyProject.Tests.csproj'

Например:

jobs:
- job: Build and Test
  displayName: Build and Test
  steps:
  - task: DotNetCoreCLI@2
    inputs:
      command: 'build'
      projects: '**/MyProject.csproj'
  - task: DotNetCoreCLI@2
    inputs:
      command: 'test'
      projects: '$(build.sourcesdirectory)/**/MyProject.Tests.csproj'

Он просмотрит все файлы в исходной папке, чтобы найти соответствующие файлы.

Обновлять:

Судя по вашим снимкам экрана о структуре файлов проекта, MyProject и MyProject.tests взяты из двух репозиториев.

Чтобы использовать файлы в конвейере, вам необходимо добавить ресурсы репозитория в конвейер Azure.

Затем вам нужно извлечь два репозитория в Azure Pipeline. Затем вы найдете соответствующие файлы csproj.

Например:

resources:
  repositories:
  - repository: MyProjectTests 
    type: git
    name: YourProjectName/MyProject.Tests 



jobs:
- job: Build and Test
  displayName: Build and Test
  steps:
  - checkout: self
  - checkout: MyProjectTests
  - task: DotNetCoreCLI@2
    inputs:
      command: 'build'
      projects: '$(build.sourcesdirectory)/**/MyProject.csproj'
  - task: DotNetCoreCLI@2
    inputs:
      command: 'test'
      projects: '$(build.sourcesdirectory)/**/MyProject.Tests.csproj'

Спасибо за ваш совет! Я добавил projects: '$(build.sourcesdirectory)/**/MyProject.Tests.csproj' Несмотря на то, что выходные данные конвейера указывают на успешное завершение, просмотрев выходные данные задачи, я обнаружил следующее предупреждающее сообщение: ##[warning]Project file(s) matching the specified pattern were not found.

StanSm789 09.04.2024 14:33

Чтобы предоставить больше контекста, структура MyProject на корневом уровне включает типичные папки MVC, а также MyProject.sln, MyProject.csproj, appsettings.json и связанные файлы. В MyProject.Tests вы найдете папки, содержащие модульные тесты, такие как «Контроллеры», «Модели» и файл MyProject.Tests.cs. Пожалуйста, сообщите о дальнейших шагах по правильной настройке конвейера для идентификации и выполнения модульных тестов, расположенных в MyProject.Tests.

StanSm789 09.04.2024 14:34

@ StanSm789 StanSm789 Вы имеете в виду, что в папке MyProject.Tests нет файла csproj?

Kevin Lu-MSFT 09.04.2024 16:30

Можете ли вы успешно запустить проект на своем локальном компьютере?

Kevin Lu-MSFT 09.04.2024 16:31

У MyProject.Tests есть файл .csproj. Кроме того, я могу успешно запустить проект на локальном компьютере, используяCtrl + R - T или нажав кнопку Run All Tests.

StanSm789 10.04.2024 01:41

@ StanSm789 StanSm789 Если возможно, можете ли вы отредактировать свой вопрос, чтобы поделиться снимком экрана со всей структурой файлов проекта. Я не могу четко понять конкретное место, просто описав его.

Kevin Lu-MSFT 10.04.2024 03:26

готово, я добавил скриншоты к своему вопросу

StanSm789 11.04.2024 06:43

@ StanSm789 StanSm789 На скриншоте видно, что эти два проекта взяты из двух репозиториев. Вам необходимо использовать ресурсы репозитория в Azure Pipeline для извлечения двух репозиториев. Затем вы можете определить путь к файлу. Для получения более подробной информации обратитесь к обновлению в моем ответе выше.

Kevin Lu-MSFT 11.04.2024 07:15

Другие вопросы по теме