Модульное тестирование
Кроссплатформенные приложения должны тестироваться, так как они будут использоваться в реальном мире для улучшения качества, надежности и производительности. Многие типы тестирования должны выполняться в приложении, включая модульное тестирование, тестирование интеграции и тестирование пользовательского интерфейса. Модульное тестирование является наиболее распространенной формой и важно для создания высококачественных приложений.
Модульный тест принимает небольшую единицу приложения, как правило, метод, изолирует его от остальной части кода и проверяет, что он работает должным образом. Его целью является проверка того, что каждая единица функциональных возможностей выполняется должным образом, поэтому ошибки не распространяются по всему приложению. Обнаружение ошибки, в которой оно происходит более эффективно, чем наблюдение за эффектом ошибки косвенно в вторичной точке сбоя.
Модульные тесты обычно используют шаблон строго-act-assert:
Этап | Description |
---|---|
Упорядочить | Инициализировать объекты и задать значение данных, передаваемых в тестируемый метод. |
Действие | Вызовите тестируемый метод с необходимыми аргументами. |
Assert | Убедитесь, что действие метода в тестируемом режиме работает должным образом. |
Этот шаблон гарантирует, что модульные тесты доступны для чтения, самоописания и согласованности.
Модульное тестирование оказывает наибольшее влияние на качество кода, если это неотъемлемая часть рабочего процесса разработки программного обеспечения. Модульные тесты могут выступать в качестве документации по проектированию и функциональным спецификациям приложения. Как только метод написан, модульные тесты должны быть записаны, которые проверяют поведение метода в ответ на стандартные, границы и неправильные входные данные и проверяют любые явные или неявные предположения, сделанные кодом. Кроме того, при разработке на основе тестов модульные тесты записываются перед кодом.
Внимание
Модульные тесты очень эффективны для регрессии. То есть функциональные возможности, которые использовались для работы, но были нарушены сбойным обновлением.
xUnit — это рекомендуемая платформа тестирования для приложений .NET MAUI.
Добавление тестов xUnit в решение MAUI .NET
Чтобы добавить тесты xUnit в решение .NET MAUI, выполните следующие действия.
Используйте Visual Studio для добавления нового проекта теста xUnit в решение.
ИЛИ
Используйте .NET CLI для создания нового тестового проекта xUnit и добавления его в решение. Дополнительные сведения см. в разделе C# модульного тестирования в .NET с помощью dotnet test и xUnit.
Файл проекта (CSPROJ) для тестового проекта xUnit будет похож на следующий пример:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<IsPackable>false</IsPackable>
<IsTestProject>true</IsTestProject>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="coverlet.collector" Version="6.0.0" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.8.0" />
<PackageReference Include="xunit" Version="2.5.3" />
<PackageReference Include="xunit.runner.visualstudio" Version="2.5.3" />
</ItemGroup>
<ItemGroup>
<Using Include="Xunit" />
</ItemGroup>
</Project>
Свойство $(TargetFramework)
сборки указывает целевую платформу для тестового проекта. Это будет последняя версия .NET, установленная на компьютере.
Пакет xunit
предоставляет дочерние пакеты, включающие платформу тестирования, и анализаторы Roslyn, которые обнаруживают распространенные проблемы с модульными тестами. Microsoft.NET.Test.Sdk
Для xunit.runner.visualstudio
выполнения модульных тестов в Visual Studio и команде dotnet test
требуются пакеты. Пакеты coverlet.collector
позволяют собирать покрытие кода. Если вы не собираетесь собирать покрытие кода, можно удалить эту ссылку на пакет. Дополнительные сведения о охвате кода для модульного тестирования см. в разделе "Использование покрытия кода для модульного тестирования".
Существует два основных подхода к структурированию приложения для модульного тестирования:
- Код, который будет выполняться модульным тестом, находится в проекте библиотеки классов .NET MAUI.
- Код, который будет выполняться модульным тестом, находится в проекте приложения .NET MAUI.
Для каждого подхода требуется определенная конфигурация.
Настройка проекта библиотеки классов .NET MAUI для модульного тестирования
С помощью этого подхода код, который требуется модульный тест, находится в проекте библиотеки классов .NET MAUI, который используется проектом приложения .NET MAUI. Для записи модульных тестов в библиотеку классов .NET MAUI потребуется обновить целевые платформы, используемые проектом. Это можно сделать, добавив значение свойства сборки $(TargetFramework)
из файла проекта теста xUnit (CSPROJ) в $(TargetFrameworks)
свойство сборки в файле проекта библиотеки классов .NET MAUI:
<TargetFrameworks>net8.0;net8.0-android;net8.0-ios;net8.0-maccatalyst</TargetFrameworks>
В этом примере значение net8.0
добавлено $(TargetFrameworks)
в свойство сборки в файле проекта библиотеки классов .NET MAUI.
Затем необходимо добавить ссылку на проект библиотеки классов .NET MAUI из тестового проекта xUnit.
Настройка проекта приложения .NET MAUI для модульного тестирования
При таком подходе код, который требуется модульного теста, находится в проекте приложения .NET MAUI. Для записи модульных тестов в проект приложения .NET MAUI потребуется обновить целевые платформы, используемые проектом. Это можно сделать, добавив значение свойства сборки $(TargetFramework)
из файла проекта теста xUnit (CSPROJ) в $(TargetFrameworks)
свойство сборки в файле проекта приложения .NET MAUI:
<TargetFrameworks>net8.0;net8.0-android;net8.0-ios;net8.0-maccatalyst</TargetFrameworks>
В этом примере значение net8.0
добавлено в $(TargetFrameworks)
свойство сборки в файле проекта приложения .NET MAUI.
Кроме того, необходимо изменить проект приложения .NET MAUI, чтобы он не выводл исполняемый файл для целевой платформы, используемой тестовым проектом xUnit. Это можно сделать, добавив условие в $(OutputType)
свойство сборки в файле проекта приложения .NET MAUI:
<OutputType Condition="'$(TargetFramework)' != 'net8.0'">Exe</OutputType>
В этом примере проект приложения .NET MAUI создает исполняемый файл только в том случае, если целевая платформа не net8.0
является.
Затем необходимо добавить ссылку на проект приложения .NET MAUI из тестового проекта xUnit.
Написание модульных тестов
xUnit поддерживает два различных типа модульных тестов:
Тип тестирования | Атрибут | Description |
---|---|---|
Факты | Fact |
Тесты, которые всегда являются истинными, которые проверяют инвариантные условия. |
Теории | Theory |
Тесты, которые соответствуют только определенному набору данных. |
Модульные тесты должны быть помещены в тестовый проект xUnit и украшены атрибутом или [Theory]
атрибутом[Fact]
. В следующем примере показаны модульные тесты, использующие [Fact]
атрибут:
namespace MyUnitTests
{
public class MyTests
{
[Fact]
public void PassingTest()
{
Assert.AreEqual(4, 2+2);
}
[Fact]
public void FailingTest()
{
Assert.AreEqual(5, 2+2);
}
}
}
В этом примере тесты представляют собой намеренное прохождение и сбой теста.
В следующем примере показаны модульные тесты, использующие [Theory]
атрибут:
namespace MyUnitTests
{
public class MyTests
{
[Theory]
[InlineData(3)]
[InlineData(4)]
[InlineData(5)]
public void MyTheoryTest(int value)
{
Assert.True(value % 2 == 1);
}
}
}
В этом примере, даже если существует только один метод теста, на самом деле есть три теста, так как теория будет выполняться один раз для каждого элемента данных.
Совет
Протестируйте одну операцию с каждым модульным тестом. По мере расширения сложности теста он затрудняет проверку этого теста. Ограничив модульный тест одной проблемой, вы можете убедиться, что тесты повторяются, изолированы и имеют более короткое время выполнения. Дополнительные сведения см. в рекомендациях по модульной проверке.
Выполнение модульных тестов
Модульные тесты можно запускать в обозревателе тестов в Visual Studio или с помощью dotnet test
команды. Сведения о обозревателе тестов см. в разделе "Запуск модульных тестов" с помощью обозревателя тестов. Сведения о команде dotnet test
см. в разделе "Модульное тестирование C# в .NET" с помощью dotnet test и xUnit и dotnet test.
Выполнение модульных тестов с помощью средств выполнения устройств
Модульные тесты также можно запускать на устройстве с помощью средства запуска устройства. Средство выполнения устройства — это тестовое приложение runner, которое предоставляет визуальную оболочку runner и некоторые перехватчики для запуска из ИНТЕРФЕЙСА командной строки с помощью XHarness. Дополнительные сведения см. в документации на вики-сайте тестового запуска устройств.