Здравствуйте, Коваленко Дмитрий, Вы писали:
КД>Есть сборка с тестами (NUnit) в количестве 18.5 тыщ.
КД>Отдельные тесты запускаются достаточно бодро.
КД>А вот когда говоришь (в Test Explorer) "Run All" — студия сначала около 8 восьми минут очень долго тупит (в testhost.exe), а потом начинает их выполнять.
Подключился отладчиком к testhost.exe. Символы подгрузились без проблем.
| | Стек |
| | System.Linq.dll!System.Linq.Enumerable.Any<NUnit.Framework.Internal.TestFilter>(System.Collections.Generic.IEnumerable<NUnit.Framework.Internal.TestFilter> source, System.Func<NUnit.Framework.Internal.TestFilter, bool> predicate) Line 59 C# Symbols loaded.
> nunit.framework.dll!NUnit.Framework.Internal.Filters.OrFilter.Pass(NUnit.Framework.Interfaces.ITest test, bool negated) Line 59 C# Symbols loaded.
nunit.framework.dll!NUnit.Framework.Internal.TestFilter.Pass(NUnit.Framework.Interfaces.ITest test) Line 68 C# Symbols loaded.
nunit.framework.dll!NUnit.Framework.Internal.TestSuite.TestSuite(NUnit.Framework.Internal.TestSuite suite, NUnit.Framework.Interfaces.ITestFilter filter) Line 117 C# Symbols loaded.
nunit.framework.dll!NUnit.Framework.Internal.TestSuite.Copy(NUnit.Framework.Interfaces.ITestFilter filter) Line 189 C# Symbols loaded.
nunit.framework.dll!NUnit.Framework.Internal.TestSuite.TestSuite(NUnit.Framework.Internal.TestSuite suite, NUnit.Framework.Interfaces.ITestFilter filter) Line 121 C# Symbols loaded.
nunit.framework.dll!NUnit.Framework.Internal.TestSuite.Copy(NUnit.Framework.Interfaces.ITestFilter filter) Line 189 C# Symbols loaded.
nunit.framework.dll!NUnit.Framework.Internal.TestSuite.TestSuite(NUnit.Framework.Internal.TestSuite suite, NUnit.Framework.Interfaces.ITestFilter filter) Line 121 C# Symbols loaded.
nunit.framework.dll!NUnit.Framework.Internal.TestSuite.Copy(NUnit.Framework.Interfaces.ITestFilter filter) Line 189 C# Symbols loaded.
nunit.framework.dll!NUnit.Framework.Internal.TestSuite.TestSuite(NUnit.Framework.Internal.TestSuite suite, NUnit.Framework.Interfaces.ITestFilter filter) Line 121 C# Symbols loaded.
nunit.framework.dll!NUnit.Framework.Internal.TestSuite.Copy(NUnit.Framework.Interfaces.ITestFilter filter) Line 189 C# Symbols loaded.
nunit.framework.dll!NUnit.Framework.Internal.TestSuite.TestSuite(NUnit.Framework.Internal.TestSuite suite, NUnit.Framework.Interfaces.ITestFilter filter) Line 121 C# Symbols loaded.
nunit.framework.dll!NUnit.Framework.Internal.TestSuite.Copy(NUnit.Framework.Interfaces.ITestFilter filter) Line 189 C# Symbols loaded.
nunit.framework.dll!NUnit.Framework.Internal.TestSuite.TestSuite(NUnit.Framework.Internal.TestSuite suite, NUnit.Framework.Interfaces.ITestFilter filter) Line 121 C# Symbols loaded.
nunit.framework.dll!NUnit.Framework.Internal.TestSuite.Copy(NUnit.Framework.Interfaces.ITestFilter filter) Line 189 C# Symbols loaded.
nunit.framework.dll!NUnit.Framework.Internal.TestSuite.TestSuite(NUnit.Framework.Internal.TestSuite suite, NUnit.Framework.Interfaces.ITestFilter filter) Line 121 C# Symbols loaded.
nunit.framework.dll!NUnit.Framework.Internal.TestSuite.Copy(NUnit.Framework.Interfaces.ITestFilter filter) Line 189 C# Symbols loaded.
nunit.framework.dll!NUnit.Framework.Internal.TestSuite.TestSuite(NUnit.Framework.Internal.TestSuite suite, NUnit.Framework.Interfaces.ITestFilter filter) Line 121 C# Symbols loaded.
nunit.framework.dll!NUnit.Framework.Internal.TestSuite.Copy(NUnit.Framework.Interfaces.ITestFilter filter) Line 189 C# Symbols loaded.
nunit.framework.dll!NUnit.Framework.Internal.TestSuite.TestSuite(NUnit.Framework.Internal.TestSuite suite, NUnit.Framework.Interfaces.ITestFilter filter) Line 121 C# Symbols loaded.
nunit.framework.dll!NUnit.Framework.Internal.TestSuite.Copy(NUnit.Framework.Interfaces.ITestFilter filter) Line 189 C# Symbols loaded.
nunit.framework.dll!NUnit.Framework.Internal.TestSuite.TestSuite(NUnit.Framework.Internal.TestSuite suite, NUnit.Framework.Interfaces.ITestFilter filter) Line 121 C# Symbols loaded.
nunit.framework.dll!NUnit.Framework.Internal.TestSuite.Copy(NUnit.Framework.Interfaces.ITestFilter filter) Line 189 C# Symbols loaded.
nunit.framework.dll!NUnit.Framework.Internal.TestSuite.TestSuite(NUnit.Framework.Internal.TestSuite suite, NUnit.Framework.Interfaces.ITestFilter filter) Line 121 C# Symbols loaded.
nunit.framework.dll!NUnit.Framework.Internal.TestSuite.Copy(NUnit.Framework.Interfaces.ITestFilter filter) Line 189 C# Symbols loaded.
nunit.framework.dll!NUnit.Framework.Internal.TestSuite.TestSuite(NUnit.Framework.Internal.TestSuite suite, NUnit.Framework.Interfaces.ITestFilter filter) Line 121 C# Symbols loaded.
nunit.framework.dll!NUnit.Framework.Internal.TestSuite.Copy(NUnit.Framework.Interfaces.ITestFilter filter) Line 189 C# Symbols loaded.
nunit.framework.dll!NUnit.Framework.Internal.TestSuite.TestSuite(NUnit.Framework.Internal.TestSuite suite, NUnit.Framework.Interfaces.ITestFilter filter) Line 121 C# Symbols loaded.
nunit.framework.dll!NUnit.Framework.Internal.TestAssembly.TestAssembly(NUnit.Framework.Internal.TestAssembly assembly, NUnit.Framework.Interfaces.ITestFilter filter) Line 70 C# Symbols loaded.
nunit.framework.dll!NUnit.Framework.Api.NUnitTestAssemblyRunner.ExploreTests(NUnit.Framework.Interfaces.ITestFilter filter) Line 200 C# Symbols loaded.
nunit.framework.dll!NUnit.Framework.Api.FrameworkController.ExploreTests(string filter) Line 212 C# Symbols loaded.
|
| | |
OnFilter.Pass
public override bool Pass( ITest test, bool negated )
{
if (negated)
return Filters.All(f => f.Pass(test, negated));
return Filters.Any(f => f.Pass(test, negated));
}
В коллекции Filters 18543 элемента. Это
все мои тестыАвтор: Коваленко Дмитрий
Дата: 17.03.21
.
Я так понимаю, каждый из 18543 тестов линейным поиском проверяется на наличие в списке из 18543 элементов.
Можно копнуть поглубже — посмотреть как работает f.Pass(test, negated)
| | Стек |
| | > nunit.framework.dll!NUnit.Framework.Internal.Filters.ValueMatchFilter.Match(string input) Line 66 C# Symbols loaded.
nunit.framework.dll!NUnit.Framework.Internal.Filters.FullNameFilter.Match(NUnit.Framework.Interfaces.ITest test) Line 45 C# Symbols loaded.
nunit.framework.dll!NUnit.Framework.Internal.TestFilter.Pass(NUnit.Framework.Interfaces.ITest test, bool negated) Line 86 C# Symbols loaded.
nunit.framework.dll!NUnit.Framework.Internal.Filters.OrFilter.Pass.AnonymousMethod__1(NUnit.Framework.Internal.TestFilter f) Line 59 C# Symbols loaded.
System.Linq.dll!System.Linq.Enumerable.Any<NUnit.Framework.Internal.TestFilter>(System.Collections.Generic.IEnumerable<NUnit.Framework.Internal.TestFilter> source, System.Func<NUnit.Framework.Internal.TestFilter, bool> predicate) Line 61 C# Symbols loaded.
nunit.framework.dll!NUnit.Framework.Internal.Filters.OrFilter.Pass(NUnit.Framework.Interfaces.ITest test, bool negated) Line 59 C# Symbols loaded.
|
| | |
/// <summary>
/// Match the input provided by the derived class
/// </summary>
/// <param name="input">The value to be matched</param>
/// <returns>True for a match, false otherwise.</returns>
protected bool Match(string input)
{
if (IsRegex)
return input != null && new Regex(ExpectedValue).IsMatch(input);
else
return ExpectedValue == input; // <------------- здесь.
}
Как раз здесь (ExpectedValue == input) сравнивается имя теста с элементом фильтра.
UPD. Нашел у них (разрабов NUnit) свежий тикет по этому поводу —
NUnit with dotnet test results in O(n^2) filtering complexity
-- Пользователи не приняли программу. Всех пришлось уничтожить. --