Я использую MSTest для тестирования, и когда я хочу применить больше входных данных, тогда тест выглядит следующим образом:
[TestMethod]
public void SumTest()
{
// data to test
var items = new [] {
new { First = 1, Second = 1, Expected = 2 },
new { First = -1, Second = 1, Expected = 0 },
new { First = 1, Second = 2, Expected = 3 },
new { First = 1, Second = -1, Expected = 0 },
};
ICalculator target = GetSum(); // can be in the loop body
foreach(var item in items)
{
var actual = target.Sum(item.First, item.Second);
Assert.AreEqual(item.Expected, actual);
}
}
Я чувствую, что этот вид тестирования не является правильным способом.Т.е. я хотел бы разделить тестирование, генерацию данных и само тестирование.
Я знаю, что в MSTest есть поддержка "тест на основе данных", но мне этого недостаточно:
- Коллекция
items
не может быть сгенерирована с использованием какого-либо алгоритма. - Я не могу использовать непримитивные типы.
Так что вы предлагаете для такого рода тестов?
Мне бы хотелось иметь что-то подобное, но я не уверен, что это правильный путь и поддерживает ли какой-либо каркас тестирования этот сценарий.
[TestData]
public IEnumerable<object> SumTestData()
{
yield return new { First = 1, Second = 1, Expected = 2 };
yield return new { First = -1, Second = 1, Expected = 0 };
yield return new { First = 1, Second = 2, Expected = 3 };
yield return new { First = 1, Second = -1, Expected = 0 };
}
[TestMethod(DataSource="method:SumTestData")]
public void SumTest(int first, int second, int expected)
{
// this test is runned for each item that is got from SumTestData method
// (property -> parameter mapping is no problem)
ICalculator target = GetSum();
var actual = target.Sum(first, second);
Assert.AreEqual(expected, actual);
}