Nunit: Возможно ли, чтобы тесты отображались вложенными

Я хочу протестировать один метод с высокой циклической сложностью (sigh), и я хотел бы иметь класс в тестовом классе, чтобы класс тестирования метода отображался как node в дереве. Возможно ли это с Nunit и как?

 MyEntityTests
 |
 L_ MyComplexMethodTests
    L when_some_condition_than
    L when_some_other_condition_than

[TestFixture]
public class MyEntityTests
{
  [TestFixture]
  public class MyComplexMethodTests
  {
    [Test]
     public void when_some_condition_than() {} 
   etc.....

  }
}

Ответ 1

Вы можете сделать это с вложенными классами, очень похожими на код примера в вашем вопросе.

Единственное отличие вашего кода заключается в том, что внешнему классу не нужен атрибут [TestFixture], если он используется только для структуры и не имеет самих тестов.

Вы также можете иметь все внутренние классы совместно использовать метод Setup, помещая его во внешний класс и наследуя внутренние классы от внешнего класса:

using NUnit.Framework;

namespace My.Namespace
{
    public class MyEntityTests
    {
        [SetUp]
        public void Setup()
        {
        }

        [TestFixture]
        public class MyComplexMethodTests : MyEntityTests
        {
            [Test]
            public void when_some_condition_than()
            {
            }

            [Test]
            public void when_some_other_condition_then()
            {
            }
        }
    }
}

В графическом интерфейсе NUnit этот тестовый класс будет выглядеть следующим образом:

NUnit GUI

Ответ 2

Я использовал (злоупотребляемые?) пространства имен, чтобы получить это поведение:

namespace MyEntityTests.MyComplexMethodTests
{
    [TestFixture]
    public class when_some_condition_than
    {
        [Test]
        public void it_should_do_something()
        {           
        }
    }

    [TestFixture]
    public class when_some_other_condition_than
    {
        [Test]
        public void it_should_do_something_else()
        {          
        }
    }
}

Что вам даст:

MyEntityTests
- MyComplexMethodTests
  - when_some_condition_than
    - it_should_do_something
  - when_some_other_condition_than
    - it_should_do_something_else

В этом случае я обычно использую TestFixture для определения контекста для теста.

Ответ 3

Похоже, у вас есть один класс, который вы хотите протестировать, но у вас есть два набора/типы тестов для запуска. Самый простой способ сделать это - создать два TestFixtures, по одному для каждого. Другой способ сделать это - разместить каждый тест в категории.

Изменить: если все тесты относятся к одному и тому же методу, одним из вариантов является использование атрибута TestCase и указать параметры для каждого (а также ожидаемый результат). GUI будет определять каждый набор параметров TestCase под одним экземпляром этого имени теста. Это предполагает, что все ваши тесты будут вести себя одинаково, что означает те же основные утверждения или ExpectedExceptions.