(Эта статья изначально опубликована в моем блоге)
Поработав некоторое время с C# при написании настольных приложений, я начал переходить на стандарт .NET. По моему профессиональному опыту, переход был намного медленнее из-за требований к продукту и времени, но в моем личном развитии нет причин, по которым я не мог бы начать с него. И называйте меня сумасшедшим, но мне нравится писать закодированные тесты для вещей, которые я делаю. Моя любимая среда тестирования для моей разработки на C# — это xUnit, и, естественно, когда я начал писать новый код с .NET Standard, я хотел убедиться, что мои тесты запустятся.
xUnit-тесты — пример
Вот пример кода на C#, который я написал для своих модульных тестов простого класса кэша LRU, с которым я играл:
[ExcludeFromCodeCoverage] public sealed class LruCachetests { [Fact] public void Constructor_CapacityTooSmall_ThrowsArgumentException() { Assert.Throws<ArgumentException>(() => new LruCache<int, int>(0)); } [Fact] public void ContainsKey_EntryExists_True() { var cache = new LruCache<int, int>(1); cache.Add(0, 1); var actual = cache.ContainsKey(0); Assert.True( actual, $"Unexpected result for '{nameof(LruCache<int, int>.ContainsKey)}'."); } }
Довольно простые вещи. Я знаю, что для xUnit в Visual Studio мне нужно получить пакет nuget, чтобы программа запуска тестов работала прямо в IDE. Достаточно просто, мне просто нужно добавить пакет «xunit.runner.visualstudio» вместе с пакетом xunit, который я уже включил в свой тестовый проект.
Готов зажечь! Итак, я запускаю все свои тесты в решении, но меня встречает небольшой сюрприз:
[3/24/2020 3:59:10.570 PM] ========== Discovery aborted: 0 tests found (0:00:00.0622045) ========== [3/24/2020 3:59:20.510 PM] ---------- Discovery started ---------- Microsoft.VisualStudio.TestPlatform.ObjectModel.TestPlatformException: Unable to find C:[redacted]binDebugnetstandard2.0testhost.dll. Please publish your test project and retry. at Microsoft.VisualStudio.TestPlatform.CrossPlatEngine.Hosting.DotnetTestHostManager.GetTestHostPath(String runtimeConfigDevPath, String depsFilePath, String sourceDirectory) at Microsoft.VisualStudio.TestPlatform.CrossPlatEngine.Hosting.DotnetTestHostManager.GetTestHostProcessStartInfo(IEnumerable`1 sources, IDictionary`2 environmentVariables, TestRunnerConnectionInfo connectionInfo) at Microsoft.VisualStudio.TestPlatform.CrossPlatEngine.Client.ProxyOperationManager.SetupChannel(IEnumerable`1 sources, String runSettings) at Microsoft.VisualStudio.TestPlatform.CrossPlatEngine.Client.ProxyDiscoveryManager.DiscoverTests(DiscoveryCriteria discoveryCriteria, ITestDiscoveryEventsHandler2 eventHandler) [3/24/2020 3:59:20.570 PM] ========== Discovery aborted: 0 tests found (0:00:00.0600179) ========== Executing all tests in project: [redacted].Tests [3/24/2020 3:59:20.635 PM] ---------- Run started ---------- [3/24/2020 3:59:20.639 PM] ========== Run finished: 0 tests run (0:00:00.0039314) ==========
Опубликуйте свой тестовый проект и повторите попытку? Хм?
Как и любой инженер-программист, я отправился в Google за ответами. Я наткнулся на это сообщение о переполнении стека: https://stackoverflow.com/q/54770830/2704424
Решение моих проблем с xUnit
И, к счастью, кто-то ответил ссылкой на документацию xUnit: Почему xUnit.net не поддерживает netstandard?
Ответ был прямо наверху!
netstandard
— это API, а не платформа. Из-за того, как сегодня работают сборки и разрешение зависимостей, тестовые проекты xUnit.net должны быть нацелены на платформу (настольная среда CLR, .NET Core и т. д.) и выполняться с приложением запуска для конкретной платформы.
Мое решение заключалось в том, что я изменил свой тестовый проект на сборку для одной из последних платформ .NET Framework… и вуаля! Я выбрал .NET 4.8 как последнюю доступную на момент написания.
Моя следующая попытка запустить все мои тесты выглядела так:
Executing all tests in project: [Redacted].Tests [3/24/2020 3:59:20.635 PM] ---------- Run started ---------- [3/24/2020 3:59:20.639 PM] ========== Run finished: 0 tests run (0:00:00.0039314) ========== [3/24/2020 4:08:14.898 PM] ---------- Discovery started ---------- [xUnit.net 00:00:00.00] xUnit.net VSTest Adapter v2.4.1 (32-bit Desktop .NET 4.0.30319.42000) [xUnit.net 00:00:00.40] Discovering: [Redacted].Tests [xUnit.net 00:00:00.47] Discovered: [Redacted].Tests [xUnit.net 00:00:00.00] xUnit.net VSTest Adapter v2.4.1 (32-bit Universal Windows) [3/24/2020 4:08:16.289 PM] ========== Discovery finished: 2 tests found (0:00:01.3819229) ========== Executing all tests in project: [Redacted].Tests [3/24/2020 4:08:17.833 PM] ---------- Run started ---------- [xUnit.net 00:00:00.00] xUnit.net VSTest Adapter v2.4.1 (32-bit Desktop .NET 4.0.30319.42000) [xUnit.net 00:00:00.41] Starting: [Redacted].Tests [xUnit.net 00:00:00.66] Finished: [Redacted].Tests [3/24/2020 4:08:19.337 PM] ========== Run finished: 2 tests run (0:00:01.4923808) ==========
И я снова на пути к успеху! Надеюсь, если вы столкнетесь с этой же проблемой, вы сможете решить ее таким же образом. Удачного тестирования!
(Эта статья изначально опубликована в моем блоге)