Как использовать атрибуты TestCaseSource и TestOf в одном тесте?

Я пытаюсь определить параметризованный тест, который получает данные, используя TestCaseSource. Мне также нужно определить атрибут, чтобы связать каждый тест с билетом Jira, и, как рекомендовано здесь я использую атрибут TestOf следующим образом:

[TestOf("SomeId")]
[TestCaseSource(typeof(SomeProviderClass), "someMethod")]
public void SampleTest(dynamic myData)
{
    //do something with myData
    //assert something
}

Однако при выполнении теста в TearDown размер TestContext.CurrentContext.Test.Properties, который должен иметь значение TestOf, пуст. Как мне определить атрибуты, которые должны быть правильно распознаны NUnit?


person Gabriel Candia    schedule 03.04.2020    source источник


Ответы (1)


Когда вы используете TestCaseSource, вы фактически создаете «набор» тестов. Тест NUnit структурирован в виде дерева. Обычно ваша сборка будет верхним корнем дерева, а каждый класс внутри него — ветвью, которая, в свою очередь, разветвляется и включает все отдельные методы тестирования. то есть

                           -Test1
              - TestClassA -Test2
                           -Test3
TestAssembly  
                           -Test4
              - TestClassB -Test5
                           -Test6             

Вы можете увидеть эту структуру, если посмотрите на TestResults.xml.

Когда вы используете TestCaseSource, вы фактически создаете еще один уровень в дереве. Итак, теперь ваше дерево выглядит так.

                                                -Test1A
                           -TestCaseSourceSuite -Test1B
                                                -Test1C
              - TestClassA -Test2
                           -Test3
TestAssembly  
                           -Test4
              - TestClassB -Test5
                           -Test6             

В вашем примере TestCaseSourceSuite будет называться SampleTest. Причина того, что то, что у вас есть в настоящее время, не работает, заключается в том, что атрибут TestOf в настоящее время применяется к TestCaseSourceSuite, а не Test1A, Test1B Test1C. (Такие свойства, как TestOf, не копируют вверх или вниз по дереву иерархически.)


Так или иначе. Как это исправить? ???? Использование TestCaseData для вашего TestCaseSource кажется лучшим выбором. TestOfAttribute на самом деле не очень полезен, поэтому нет «именованного свойства» для установки значения, но вместо этого вы можете использовать метод SetProperty и класс PropertyNames. Попробуйте что-нибудь вроде этого...

public class MyTests
{
    [TestCaseSource(typeof(MyDataClass), "TestCases")]
    public void Test(int n, int d)
    {
        Assert.IsTrue(true);
    }
}

public class MyDataClass
{
    public static IEnumerable TestCases
    {
        get
        {
            yield return new TestCaseData(12, 3).SetProperty(PropertyNames.TestOf, "MethodUnderTest");
            yield return new TestCaseData(12, 2).SetProperty(PropertyNames.TestOf, "MethodUnderTest");
        }
    }  
}

Надеюсь, это поможет!

person Chris    schedule 03.04.2020
comment
Спасибо за Ваш ответ! Я не знал о создании еще одного уровня в дереве при использовании TestCaseSource. Я попробовал предложенное вами решение, однако оно может не подойти в моем случае, учитывая, что иногда одни и те же TestCaseData используются для нескольких тестов, поскольку я использую одно и то же тело json в качестве данных для разных тестов API. На данный момент я использую TestExecutionContext.CurrentContext.CurrentTest.Properties.Set("JiraID", "SomeID"); внутри теста для определения свойства. Однако я не уверен, что это хороший подход. Любые другие предложения будут полезны. Спасибо! - person Gabriel Candia; 06.04.2020
comment
Боюсь, вы правы, это не лучший подход. Этот конкретный API никогда не предназначался для раскрытия, поэтому он может исчезнуть в будущем! См. историю этой проблемы здесь: github.com/nunit/nunit/issues/3136 К сожалению, еще не существует поддерживаемого способа добавления тестовых свойств во время выполнения — это то, о чем проблема № 3136, но, как вы можете видеть, никто не вызвался взяться за это. На данный момент единственным «поддерживаемым» способом сделать это является время создания теста, как указано выше. Не могли бы вы каким-то образом параметризовать свои TestCaseSources, чтобы обойти вашу проблему? - person Chris; 07.04.2020
comment
Спасибо за предысторию этого вопроса. Проанализировав это с нашей командой, мы в итоге создали отдельный файл конфигурации, в котором есть запись для каждого метода тестирования, а его имя сопоставляется с соответствующим идентификатором, который мы ожидали использовать в Jira. Доступ к этому файлу осуществляется в конце каждого теста для получения идентификатора. Мы выбрали это, учитывая, что мы думали, что его будет легче поддерживать вовремя. Это похоже на то, что вы предлагаете, это было бы отличным вариантом, если бы мы не повторно использовали данные тестовых примеров. В очередной раз благодарим за помощь! - person Gabriel Candia; 23.04.2020