Поделиться через


Модульное тестирование библиотек .NET Core в Visual Basic с использованием 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.

Создание первого теста

Напишите один тест сбоя теста, запустите его, а затем повторите этот процесс. Удалите файл UnitTest1.vb из каталога PrimeService.Tests и создайте файл Visual Basic с именем PrimeService_IsPrimeShould.VB. Добавьте следующий код:

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> обозначает метод, который выполняется с помощью средства выполнения тестов. Из каталога unit-testing-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

Выполните команду dotnet test еще раз в каталоге unit-testing-vb-mstest. Команда dotnet test запускает сборку для проекта PrimeService и затем для проекта PrimeService.Tests. После сборки обоих проектов она запускает этот отдельный тест. Он выполняется.

Добавление дополнительных возможностей

Теперь, когда тест проходит успешно, пора создать дополнительные тесты. Есть еще ряд элементарных случаев с простыми числами: 0, -1. Можно добавить их в качестве тестов с помощью атрибута <TestMethod>, но это скоро станет утомительным. Есть другие атрибуты MSTest, которые позволяют создавать наборы похожих тестов. Атрибут <DataTestMethod> представляет набор тестов, которые выполняют один и тот же код, но имеют разные входные аргументы. С помощью атрибута <DataRow> можно указать значения для этих входных аргументов.

Вместо того чтобы создавать новые тесты, используйте эти два атрибута, чтобы создать единый алгоритм, который проверяет несколько значений меньше 2, то есть наименьшего простого числа:

<TestClass>
Public Class PrimeService_IsPrimeShould
    Private _primeService As Prime.Services.PrimeService = New Prime.Services.PrimeService()

    <DataTestMethod>
    <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

    <DataTestMethod>
    <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

    <DataTestMethod>
    <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

Продолжайте итерации, добавляя тесты, алгоритмы и код в главной библиотеке. В результате вы получите готовую версию тестов и полную реализацию библиотеки.

Вы создали небольшую библиотеку и набор модульных тестов для нее. Вы структурировали решение, чтобы сделать добавление новых пакетов и тестов частью обычного рабочего процесса и получить возможность сосредоточиться на задачах приложения.