Как заставить тестовый прогон последним в visual studio с помощью NUnit

1

Таким образом, в моем тестовом наборе у меня есть абстрактный базовый класс, который наследует мои интеграционные тесты. Каждый вывод этого базового класса имеет собственный набор тестов. Утверждения, которые создаются дочерними классами, выполняются через защищенные методы в базовом классе. Во время этих утверждений журналы базового класса регистрируют значения, указанные в словаре. После того, как дочерние классы выполнили все свои тесты, я хочу, чтобы базовый класс запускал тест, который проверяет, что все правильные вещи были протестированы.

Несколько отказов:

  1. Да, я знаю, что это упорядоченный тест, и на них нахмурились. Тем не менее, это то, что я хочу сделать в любом случае.
  2. Я знаю, что это тест, который проверяет мой набор тестов, в некотором смысле. Хотя это часто неодобрительно, я считаю это полезным. Если вы хотите, чтобы ваши тесты действительно были вашей документацией, хорошо иметь некоторые рудиментарные тесты, которые проверяют некоторые основные вещи о вашей документации, - например, что это завершается. (В большинстве проектов это, вероятно, будет чрезмерным и не стоит того. В этом конкретном проекте, однако, это и персональный проект, и эксперимент по работе со 100% охватом кода.)

На данный момент я отметил итоговый тест как с [Test] и с [TestFixtureTearDown], что делает пробный запуск в конце. Тем не менее, это также означает, что когда тест выходит из строя, тестовый набор сердится, потому что срыв не удался. То, что я хочу в идеальном мире, - это что-то вроде [RunLast]. Любые идеи о том, как можно это сделать?

Пример кода:

[TestFixture]
public abstract class AttributesTests : IntegrationTests
{
    [Inject]
    public IAttributesMapper AttributesMapper { get; set; }

    protected abstract String tableName { get; }

    private Dictionary<String, IEnumerable<String>> table;
    private List<String> testedNames;

    [TestFixtureSetUp]
    public void FixtureSetup()
    {
        testedNames = new List<String>();
    }

    [SetUp]
    public void Setup()
    {
        table = AttributesMapper.Map(tableName);
    }

    [Test, TestFixtureTearDown]
    public void AllNamesTested()
    {
        var missingNames = table.Keys.Except(testedNames);
        Assert.That(missingNames, Is.Empty, tableName);
    }

    [Test, TestFixtureTearDown]
    public void NoNamesTestedNultipleTimes()
    {
        var duplicateNames = testedNames.Where(n => testedNames.Count(cn => cn == n) > 1).Distinct();
        Assert.That(duplicateNames, Is.Empty, tableName);
    }

    protected void AssertAttributes(String name, IEnumerable<String> attributes)
    {
        testedNames.Add(name);

        Assert.That(table.Keys, Contains.Item(name), tableName);

        foreach (var attribute in attributes)
        {
            Assert.That(table[name], Contains.Item(attribute));

            var actualAttributeCount = table[name].Count(a => a == attribute);
            var expectedAttributeCount = attributes.Count(a => a == attribute);
            Assert.That(actualAttributeCount, Is.EqualTo(expectedAttributeCount));
        }

        var extraAttributes = table[name].Except(attributes);
        Assert.That(extraAttributes, Is.Empty);
    }
}
Теги:
unit-testing
order
nunit

2 ответа

1

Это работает для меня:

namespace ZZZ
public class ZZZZZ {
  [Test]
  public void ZZZZLastTest() {
    // Whatever . . . 
  }
}
  • 0
    Nunit выполнит тесты в основном в алфавитном порядке. Итак, имя, начинающееся с z, заставит ваш тестовый запуск выполняться в конце. :) Простое, но потрясающее исправление
0

Явного [LastTest] -like нет, но я уверен, что вы можете пойти с [Suite].

Я знаю, что этот подход JUnit к наборам будет выполнять ваши тестовые классы в линейном порядке по мере их определения (хотя нет гарантии того, что ваши тесты внутри одного класса выполняются).

@RunWith(Suite.class)
@SuiteClasses({ CalculatorTestAdd.class, CalculatorTestSubtract.class })
public class AllTests {

}

Здесь CalculatorTestSubtract будет выполнен последним. Помня об этом, я бы сказал, что вы должны создать набор, который будет содержать ваш итоговый тест в конце.

Глядя на документацию NUnit, я вижу, что что-то должно быть одинаково возможным:

namespace NUnit.Tests
{
  using System;
  using NUnit.Framework;

  private class AllTests
  {
    [Suite]
    public static IEnumerable Suite
    {
      get
      {
        ArrayList suite = new ArrayList();
        suite.Add(new OneTestCase());
        suite.Add(new AssemblyTests());
        suite.Add(new NoNamespaceTestFixture());
        return suite;
      }
    }
  }
}

Вам нужно будет выполнить некоторые тесты, чтобы убедиться, что они выполняются линейно, потому что не требуется сортировка ArrayList.

  • 0
    Таким образом, в моем случае итоговые тесты должны выполняться после всех тестов в каждом производном базового класса - если есть три конкретных производных базового класса, то тест должен выполняться после каждого производного с его тестами (поэтому три экземпляра теста, в основном, напрямую связаны с конкретной реализацией базового класса). Я боюсь, что комплексный подход сделает итоговые тесты слишком изолированными от конкретных реализаций.
  • 0
    Вы должны будете помнить, чтобы расположить их в правильном порядке в вашем комплекте, и они должны быть в другом классе, но это, насколько я знаю, единственное решение.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню