Информация об изменениях

Сообщение Re: VS2019. Тупёж при запуске всех тестов (NUnit) от 17.03.2021 16:58

Изменено 17.03.2021 16:58 DDDX

Re: VS2019. Тупёж при запуске всех тестов (NUnit)
Здравствуйте, Коваленко Дмитрий, Вы писали:

КД>Есть сборка с тестами (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) сравнивается имя теста с элементом фильтра.
Re: VS2019. Тупёж при запуске всех тестов (NUnit)
Здравствуйте, Коваленко Дмитрий, Вы писали:

КД>Есть сборка с тестами (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) сравнивается имя теста с элементом фильтра.