UnitTesting assembly .GetTypes() генерирует исключение только в конвейере сборки

#c# #unit-testing #azure-devops #pipeline #assemblies

#c# #модульное тестирование #azure-devops #конвейер #сборки

Вопрос:

Модульные тесты вызывают следующий метод. Он проходит при локальном запуске, но завершается сбоем при запуске как часть конвейера сборки Azure DevOps из-за исключения LoaderException в сборке.GetTypes() . Я не уверен, как это отладить, потому что это не происходит локально. Обычно я бы прогнал это в режиме отладки и посмотрел на исключение LoaderException. Задача конвейера VSTest @2 регистрирует только трассировку стека

 Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies();
foreach (Assembly assembly in assemblies)
{
   if (assembly != null)
   { Type[] types = assembly.GetTypes(); }
}
 
    Test method 
Tests.Data.IBlockConversionTests.TestIBlockConversion threw exception: 
System.Reflection.ReflectionTypeLoadException: Unable to load one or more of the requested types. Retrieve the LoaderExceptions property for more information.
  Stack Trace:
      at System.Reflection.RuntimeModule.GetTypes(RuntimeModule module)
   at System.Reflection.RuntimeModule.GetTypes()
   at System.Reflection.Assembly.GetTypes()
   at Plugin.PluginLoader`1.LoadPlugins(IEnumerable`1 assemblies) in D:a1sCorePluginPluginPluginLoader.cs:line 80
   at Tests.Data.IBlockConversionTests.TestIBlockConversion() in D:a1sTestsDataIBlockConversionTests.cs:line 42
 

Комментарии:

1. Начните с просмотра сообщения об исключении LoaderException и любого InnerExceptions

2. Как мне это сделать при запуске модульного теста на конвейере?

3. Есть ли средство ведения журнала, которое появляется в этой системе конвейера сборки?

4. Посмотрите на результаты вашего теста? Перехватить исключение и записать все, что вам нужно? Создайте специальное консольное приложение, которое просто воспроизводит проблему и печатает то, что вам нужно? Проявите фантазию!

5. Установите систему. Отладка до true docs.microsoft.com/en-us/azure/devops/pipelines/build / … чтобы проверить, будет ли что-то интересное

Ответ №1:

Решение состоит в том, чтобы изменить конвейер yaml, добавив distributionBatchType: ‘basedOnAssembly’, как показано ниже. Включение диагностики также устранило эту проблему, но не было идеальным решением.

 - task: VSTest@2
  inputs:
    testSelector: 'testAssemblies'
    testAssemblyVer2: |
      **Tests**
      !***TestAdapter.dll
      !**obj**
    searchFolder: '$(System.DefaultWorkingDirectory)'
    diagnosticsEnabled: false
    distributionBatchType: 'basedOnAssembly'
 

Комментарии:

1. Это также устранило проблему, с которой мы столкнулись в другом конвейере, где VSTest не смог найти определенные библиотеки DLL.