Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В команде dotnet test в .NET Core можно использовать выражения фильтра для выполнения выбранных модульных тестов. В этой статье демонстрируется возможность фильтрации тестов. В этих примерах используется dotnet test. Если вы используете vstest.console.exe, замените --filter на --testcasefilter:.
Note
Синтаксис --filter , описанный в следующих разделах, применяется к MSTest, NUnit и xUnit. TUnit использует другой синтаксис; Для получения сведений выберите TUnit в верхней части этой статьи.
Синтаксис
dotnet test --filter <Expression>
Выражение имеет формат
<Property><Operator><Value>[|&<Expression>].Выражения можно объединять с логическими операторами:
|для логического или,&для логического и.Выражения можно заключать в круглые скобки. Например:
(Name~MyClass) | (Name~MyClass2).Выражение без оператора интерпретируется как инструкция contains для свойства
FullyQualifiedName. Например,dotnet test --filter xyz— это тоже самое, что иdotnet test --filter FullyQualifiedName~xyz.Свойство является атрибутом объекта
Test Case. Ниже перечислены примеры свойств, которые поддерживаются популярными платформами модульного тестирования.Платформа тестирования Поддерживаемые свойства MSTest FullyQualifiedNameNameClassNamePriorityTestCategoryIdNUnit FullyQualifiedNameNamePriorityTestCategoryCategoryPropertyxUnit FullyQualifiedNameDisplayNameTraitsОператоры
-
=— точное соответствие -
!=— неточное соответствие -
~— содержит -
!~— не содержит
-
Значение является строкой. Поиск выполняется без учета регистра.
Экранирование символов
Используйте escape-последовательности для представления символов операторов фильтра в значении фильтра. Эти escape-последовательности отделены от любого из них, для которых требуется экранировать оболочку.
| escape-последовательность | Представляет |
|---|---|
\\ |
\ |
\( |
( |
\) |
) |
\& |
& |
\| |
| |
\= |
= |
\! |
! |
\~ |
~ |
Чтобы программным способом Microsoft.VisualStudio.TestPlatform.ObjectModel.Utilities.FilterHelper.Escape избежать значений Microsoft.VisualStudio.TestPlatform.ObjectModel фильтров, используйте API из пакета NuGet.
Чтобы использовать восклицательный знак (!) в выражении фильтра, необходимо экранировать его в некоторых оболочках Linux или macOS, поставив обратную косую черту перед ним (\!). Например, следующий фильтр пропускает в пространстве имен все тесты, которые содержат IntegrationTests:
dotnet test --filter FullyQualifiedName\!~IntegrationTests
Для значений FullyQualifiedName, включающих запятую для параметров универсального типа, необходимо экранировать запятую с помощью %2C. Например:
dotnet test --filter "FullyQualifiedName=MyNamespace.MyTestsClass<ParameterType1%2CParameterType2>.MyTestMethod"
Так как оболочка также анализирует выражение фильтра, цитирует все --filter значение всякий раз, когда он содержит символы, которые оболочка обрабатывает специально, например <, >или ,. Кавывание требуется в PowerShell, где запятая является оператором массива.
Для Name или DisplayNameиспользуйте кодировку URL-адресов для специальных символов. Например, чтобы запустить тест с именем MyTestMethod и строковым значением "text", используйте следующий фильтр:
dotnet test --filter "Name=MyTestMethod \(%22text%22\)"
Примеры MSTest
using Microsoft.VisualStudio.TestTools.UnitTesting;
namespace MSTestNamespace
{
[TestClass]
public class UnitTest1
{
[TestMethod, Priority(1), TestCategory("CategoryA")]
public void TestMethod1()
{
}
[TestMethod, Priority(2)]
public void TestMethod2()
{
}
}
}
| Выражение | Результат |
|---|---|
dotnet test --filter Method |
Выполняет тесты, FullyQualifiedName которых содержит Method. |
dotnet test --filter Name~TestMethod1 |
Выполняет тесты, имя которых содержит TestMethod1. |
dotnet test --filter ClassName=MSTestNamespace.UnitTest1 |
Выполняет тесты, которые находятся в классе MSTestNamespace.UnitTest1.Примечание. Значение ClassName должно иметь пространство имен, поэтому ClassName=UnitTest1 не будет работать. |
dotnet test --filter FullyQualifiedName!=MSTestNamespace.UnitTest1.TestMethod1 |
Выполняет все тесты, за исключением MSTestNamespace.UnitTest1.TestMethod1. |
dotnet test --filter TestCategory=CategoryA |
Выполняет тесты, которые помечены атрибутом [TestCategory("CategoryA")]. |
dotnet test --filter Priority=2 |
Выполняет тесты, которые помечены атрибутом [Priority(2)]. |
dotnet test --filter "Id=<guid>" |
Запускает тестовый TestCase.Id случай, обнаруженный значение которого точно соответствует GUID. |
Id Для фильтрации требуется MSTest.TestAdapter 3.6 или более поздней версии. Получите GUID из тестового случая, в TestCase.Idкоторый возвращается обнаружение VSTest. Этот фильтр может выбрать одну развернутую итерацию на основе данных без сопоставления или экранирования отображаемого имени. Каждая строка должна быть обнаружена как отдельный тестовый случай; Свернутый тест на основе данных предоставляет только одно родительское удостоверение.
Примеры использования условных операторов | и &:
Выполняет тесты, у которых есть
UnitTest1в FullyQualifiedNameилиTestCategoryAttribute является"CategoryA".dotnet test --filter "FullyQualifiedName~UnitTest1|TestCategory=CategoryA"Выполняет тесты, у которых есть
UnitTest1в FullyQualifiedNameи есть TestCategoryAttribute со значением"CategoryA".dotnet test --filter "FullyQualifiedName~UnitTest1&TestCategory=CategoryA"Выполняет тесты, у которых есть FullyQualifiedName с
UnitTest1иTestCategoryAttribute с"CategoryA"илиPriorityAttribute с приоритетом1.dotnet test --filter "(FullyQualifiedName~UnitTest1&TestCategory=CategoryA)|Priority=1"
Примеры xUnit
using Xunit;
namespace XUnitNamespace
{
public class TestClass1
{
[Fact, Trait("Priority", "1"), Trait("Category", "CategoryA")]
public void Test1()
{
}
[Fact, Trait("Priority", "2")]
public void Test2()
{
}
}
}
| Выражение | Результат |
|---|---|
dotnet test --filter DisplayName=XUnitNamespace.TestClass1.Test1 |
Выполняет только один тест — XUnitNamespace.TestClass1.Test1. |
dotnet test --filter FullyQualifiedName!=XUnitNamespace.TestClass1.Test1 |
Выполняет все тесты, за исключением XUnitNamespace.TestClass1.Test1. |
dotnet test --filter DisplayName~TestClass1 |
Выполняет тесты, отображаемое имя которых содержит TestClass1. |
В примере кода определенные характеристики с ключами "Category" и "Priority" можно использовать для фильтрации.
| Выражение | Результат |
|---|---|
dotnet test --filter XUnit |
Выполняет тесты, FullyQualifiedName которых содержит XUnit. |
dotnet test --filter Category=CategoryA |
Выполняет тесты с [Trait("Category", "CategoryA")]. |
Примеры использования условных операторов | и &:
Выполняет тесты, у которых есть
TestClass1в FullyQualifiedNameили естьTraitс ключом"Category"и значением"CategoryA".dotnet test --filter "FullyQualifiedName~TestClass1|Category=CategoryA"Выполняет тесты, у которых есть
TestClass1в FullyQualifiedNameи естьTraitс ключом"Category"и значением"CategoryA".dotnet test --filter "FullyQualifiedName~TestClass1&Category=CategoryA"Выполняет тесты, у которых есть либо FullyQualifiedName с
TestClass1и естьTraitс ключом"Category"и значением"CategoryA"или у которых естьTraitс ключом"Priority"и значением1.dotnet test --filter "(FullyQualifiedName~TestClass1&Category=CategoryA)|Priority=1"
Примеры NUnit
Для NUnit TestCategory и Category являются взаимозаменяемыми именами свойств фильтра. Обе категории, назначенные атрибутом Category , фильтруют, поэтому существующие команды NUnit, которые используются --filter Category=MyCategory , не нужно изменять.
using NUnit.Framework;
namespace NUnitNamespace
{
public class UnitTest1
{
[Test, Property("Priority", 1), Category("CategoryA")]
public void TestMethod1()
{
}
[Test, Property("Priority", 2)]
public void TestMethod2()
{
}
}
}
| Выражение | Результат |
|---|---|
dotnet test --filter Method |
Выполняет тесты, FullyQualifiedName которых содержит Method. |
dotnet test --filter Name~TestMethod1 |
Выполняет тесты, имя которых содержит TestMethod1. |
dotnet test --filter FullyQualifiedName~NUnitNamespace.UnitTest1 |
Выполняет тесты, которые находятся в классе NUnitNamespace.UnitTest1. |
dotnet test --filter FullyQualifiedName!=NUnitNamespace.UnitTest1.TestMethod1 |
Выполняет все тесты, за исключением NUnitNamespace.UnitTest1.TestMethod1. |
dotnet test --filter TestCategory=CategoryA |
Выполняет тесты, которые помечены атрибутом [Category("CategoryA")]. |
dotnet test --filter Category=CategoryA |
Выполняет те же тесты, что TestCategory=CategoryAи . |
dotnet test --filter Priority=2 |
Выполняет тесты, которые помечены атрибутом [Priority(2)]. |
Примеры использования условных операторов | и &:
Выполняет тесты, у которых есть UnitTest1 в FullyQualifiedNameили есть Category со значением "CategoryA".
dotnet test --filter "FullyQualifiedName~UnitTest1|TestCategory=CategoryA"
Выполняет тесты, у которых есть UnitTest1 в FullyQualifiedNameи есть Category со значением "CategoryA".
dotnet test --filter "FullyQualifiedName~UnitTest1&TestCategory=CategoryA"
Выполняет тесты, у которых есть FullyQualifiedName с UnitTest1иCategory с "CategoryA"или есть Property, где "Priority" имеет значение 1.
dotnet test --filter "(FullyQualifiedName~UnitTest1&TestCategory=CategoryA)|Priority=1"
Дополнительные сведения см. в документе о фильтре TestCase.
Примеры TUnit
TUnit не поддерживает вариант, описанный --filter ранее в этой статье. Вместо этого он использует параметр MTP --treenode-filter . Фильтр узла дерева — это путь в форме /<Assembly>/<Namespace>/<Class>/<Method>, где:
-
*соответствует любому значению в одном сегменте пути и может сочетаться с другим текстом, например*Method*. -
**соответствует любому количеству сегментов пути. -
[<Property>=<Value>]После того, как сегмент пути соответствует тестам, имеющим это свойство.[Category("CategoryA")]предоставляется в качестве свойстваCategoryи[Property("Priority", "2")]в качестве свойстваPriority. -
|(или) и (и&) объединяют альтернативные варианты в одном сегменте пути или фильтре свойств. Заключите каждую альтернативу в скобки, например/*/*/(UnitTest1)|(UnitTest2)/*или[(Category=CategoryA)|(Priority=2)].
Этот --treenode-filter параметр является параметром MTP, поэтому dotnet test он должен выполняться в режиме MTP. С помощью пакета SDK .NET 10 или более поздней версии добавьте следующую конфигурацию в файл global.json в корневом каталоге решения:
{
"test": {
"runner": "Microsoft.Testing.Platform"
}
}
Без него dotnet test выполняется в режиме VSTest и завершается сбоем MSB1001: Unknown switch перед выполнением тестов. Дополнительные сведения, включая запуск проектов MTP с более ранними пакетами SDK, см. в режиме MTP dotnet test.
В примерах используется следующий тестовый класс:
namespace TUnitNamespace;
public class UnitTest1
{
[Test, Property("Priority", "1"), Category("CategoryA")]
public void TestMethod1()
{
}
[Test, Property("Priority", "2")]
public void TestMethod2()
{
}
}
| Выражение | Результат |
|---|---|
dotnet test --treenode-filter "/*/*/*/*Method*" |
Выполняет тесты Method, имя метода которого содержится. |
dotnet test --treenode-filter "/*/*/*/TestMethod1" |
Выполняет тесты, имя которого равно TestMethod1. |
dotnet test --treenode-filter "/*/TUnitNamespace/UnitTest1/*" |
Выполняет все тесты в классе TUnitNamespace.UnitTest1. |
dotnet test --treenode-filter "/**[Category=CategoryA]" |
Выполняет тесты, которые помечены атрибутом [Category("CategoryA")]. |
dotnet test --treenode-filter "/**[Priority=2]" |
Выполняет тесты, которые помечены атрибутом [Property("Priority", "2")]. |
Примеры использования условных операторов | и &:
Для выполнения тестов, которые находятся в классе UnitTest1и имеют следующие Category"CategoryA"функции:
dotnet test --treenode-filter "/*/*/UnitTest1/*[Category=CategoryA]"
Чтобы выполнить тесты, у которых есть Category"CategoryA"или несколько Priority"2":
dotnet test --treenode-filter "/**[(Category=CategoryA)|(Priority=2)]"
Для выполнения тестов, которые находятся в классе UnitTest1и имеют один Category"CategoryA"или один Priority"2"из следующих вариантов:
dotnet test --treenode-filter "/*/*/UnitTest1/*[(Category=CategoryA)|(Priority=2)]"
Выполнение тестов со следующимиPriorityCategory"CategoryA""1"типами:
dotnet test --treenode-filter "/**[(Category=CategoryA)&(Priority=1)]"