Как использовать атрибуты TestCaseSource и TestOf в одном тесте? - PullRequest
1 голос
/ 03 апреля 2020

Я пытаюсь определить параметризованный тест , который получает данные, используя атрибут 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?

1 Ответ

1 голос
/ 03 апреля 2020

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

                           -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, иерархически не копируют дерево вверх или вниз.)


В любом случае. Как мы это исправим? Test Использование 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");
        }
    }  
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...