Таким образом, в моем тестовом наборе у меня есть абстрактный базовый класс, который наследует мои интеграционные тесты. Каждый вывод этого базового класса имеет собственный набор тестов. Утверждения, которые создаются дочерними классами, выполняются через защищенные методы в базовом классе. Во время этих утверждений журналы базового класса регистрируют значения, указанные в словаре. После того, как дочерние классы выполнили все свои тесты, я хочу, чтобы базовый класс запускал тест, который проверяет, что все правильные вещи были протестированы.
Несколько отказов:
На данный момент я отметил итоговый тест как с [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);
}
}
Это работает для меня:
namespace ZZZ
public class ZZZZZ {
[Test]
public void ZZZZLastTest() {
// Whatever . . .
}
}
Явного [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
.