Модульное тестирование библиотек Visual Basic .NET Core с помощью dotnet test и MSTest
В этом руководстве рассматривается интерактивный процесс создания образца решения, предоставляющий пошаговый подход к изучению концепций модульного тестирования. Если вы предпочитаете следовать руководству с помощью предварительно созданного решения, просмотрите или скачайте пример кода перед началом. Для инструкций по скачиванию см. в разделе «Примеры и руководства».
В этой статье описывается тестирование проекта .NET Core. Если вы тестируете проект ASP.NET Core, см. тесты интеграции в ASP.NET Core.
Создание исходного проекта
Откройте окно оболочки. Создайте каталог с именем unit-testing-vb-mstest для хранения решения.
В этом новом каталоге запустите dotnet new sln
, чтобы создать новое решение. Эта практика упрощает управление библиотекой классов и проектом модульного теста.
В каталоге решения создайте директорию PrimeService. До сих пор у вас есть следующая структура каталогов и файлов:
/unit-testing-vb-mstest
unit-testing-vb-mstest.sln
/PrimeService
Сделайте PrimeService текущим каталогом и запустите dotnet new classlib -lang VB
для создания исходного проекта. Переименуйте Class1.VB в PrimeService.VB. Вы создаете неудачную реализацию класса PrimeService
:
Namespace Prime.Services
Public Class PrimeService
Public Function IsPrime(candidate As Integer) As Boolean
Throw New NotImplementedException("Please create a test first")
End Function
End Class
End Namespace
Измените каталог обратно в каталог unit-testing-vb-using-mstest. Запустите dotnet sln add .\PrimeService\PrimeService.vbproj
, чтобы добавить проект библиотеки классов в решение.
Создание тестового проекта
Затем создайте каталог PrimeService.Tests. В следующей схеме показана структура каталога:
/unit-testing-vb-mstest
unit-testing-vb-mstest.sln
/PrimeService
Source Files
PrimeService.vbproj
/PrimeService.Tests
Сделайте каталог PrimeService.Tests текущим каталогом и создайте новый проект с помощью dotnet new mstest -lang VB
. Эта команда создает тестовый проект, использующий MSTest в качестве библиотеки тестов. Созданный шаблон настраивает средство выполнения теста в PrimeServiceTests.vbproj:
<ItemGroup>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.5.0" />
<PackageReference Include="MSTest.TestAdapter" Version="1.1.18" />
<PackageReference Include="MSTest.TestFramework" Version="1.1.18" />
</ItemGroup>
Тестовый проект требует создания и запуска модульных тестов других пакетов.
dotnet new
на предыдущем шаге добавлен MSTest и средство выполнения MSTest. Теперь добавьте библиотеку классов PrimeService
в качестве другой зависимости в проект. Используйте команду dotnet add reference
:
dotnet add reference ../PrimeService/PrimeService.vbproj
Весь файл можно увидеть в репозитории примеров на сайте GitHub.
У вас есть следующий окончательный макет решения:
/unit-testing-vb-mstest
unit-testing-vb-mstest.sln
/PrimeService
Source Files
PrimeService.vbproj
/PrimeService.Tests
Test Source Files
PrimeServiceTests.vbproj
Выполните dotnet sln add .\PrimeService.Tests\PrimeService.Tests.vbproj
в каталоге unit-testing-vb-mstest.
Создание первого теста
Вы пишете один не проходящий тест, делаете его успешным, а затем повторяете процесс. Удалите
Imports Microsoft.VisualStudio.TestTools.UnitTesting
Namespace PrimeService.Tests
<TestClass>
Public Class PrimeService_IsPrimeShould
Private _primeService As Prime.Services.PrimeService = New Prime.Services.PrimeService()
<TestMethod>
Sub IsPrime_InputIs1_ReturnFalse()
Dim result As Boolean = _primeService.IsPrime(1)
Assert.IsFalse(result, "1 should not be prime")
End Sub
End Class
End Namespace
Атрибут <TestClass>
указывает класс, содержащий тесты. Атрибут <TestMethod>
обозначает метод, выполняемый тестировщиком. Из модульного тестирования-vb-mstestвыполните dotnet test
, чтобы создать тесты и библиотеку классов, а затем запустить тесты. Средство выполнения тестов MSTest содержит точку входа программы, чтобы запустить ваши тесты.
dotnet test
запускает средство выполнения тестов, используя проект модульного теста, который вы создали.
Ваш тест не удался. Вы еще не создали реализацию. Выполните этот тест, написав самый простой код в классе PrimeService
, который работает:
Public Function IsPrime(candidate As Integer) As Boolean
If candidate = 1 Then
Return False
End If
Throw New NotImplementedException("Please create a test first.")
End Function
В каталоге unit-testing-vb-mstest выполните dotnet test
еще раз. Команда dotnet test
запускает сборку для проекта PrimeService
, а затем для проекта PrimeService.Tests
. После создания обоих проектов он запускает этот одиночный тест. Он проходит.
Добавление дополнительных функций
Теперь, когда вы сделали один тестовый проход, пришло время написать больше. Существует несколько других простых случаев для простых чисел: 0, -1. Эти случаи можно добавить в качестве новых тестов с помощью атрибута <TestMethod>
, но это быстро становится мучительно. Существуют другие атрибуты MSTest, позволяющие создавать набор аналогичных тестов. Атрибут <DataRow>
можно использовать вместе с атрибутом <TestMethod>
, чтобы указать значения для этих входных данных.
Вместо создания новых тестов примените эти два атрибута для создания одной теории. Теория — это метод, который проверяет несколько значений меньше двух, что является самым низким прайм-числом:
<TestClass>
Public Class PrimeService_IsPrimeShould
Private _primeService As Prime.Services.PrimeService = New Prime.Services.PrimeService()
<TestMethod>
<DataRow(-1)>
<DataRow(0)>
<DataRow(1)>
Sub IsPrime_ValuesLessThan2_ReturnFalse(value As Integer)
Dim result As Boolean = _primeService.IsPrime(value)
Assert.IsFalse(result, $"{value} should not be prime")
End Sub
<TestMethod>
<DataRow(2)>
<DataRow(3)>
<DataRow(5)>
<DataRow(7)>
Public Sub IsPrime_PrimesLessThan10_ReturnTrue(value As Integer)
Dim result As Boolean = _primeService.IsPrime(value)
Assert.IsTrue(result, $"{value} should be prime")
End Sub
<TestMethod>
<DataRow(4)>
<DataRow(6)>
<DataRow(8)>
<DataRow(9)>
Public Sub IsPrime_NonPrimesLessThan10_ReturnFalse(value As Integer)
Dim result As Boolean = _primeService.IsPrime(value)
Assert.IsFalse(result, $"{value} should not be prime")
End Sub
End Class
Запустите dotnet test
, и два из этих тестов завершаются с ошибкой. Чтобы выполнить все тесты, измените предложение if
в начале метода:
if candidate < 2
Продолжайте итерацию, добавляя дополнительные тесты, дополнительные теории и другие коды в основной библиотеке. У вас есть завершенная версия тестов, а полная реализация библиотеки.
Вы создали небольшую библиотеку и набор модульных тестов для этой библиотеки. Вы структурировали решение таким образом, чтобы добавление новых пакетов и тестов было частью обычного рабочего процесса. Вы сосредоточили большую часть времени и усилий на решении целей приложения.