Я уже давно являюсь поклонником библиотеки Python по той простой причине, что комментарии могут быть полезны, но также полезны при утверждении правильного поведения. Недавно я наткнулся на (по-видимому) малоизвестный System.Diagnostics.ConditionalAttribute для .NET. Это можно легко использовать, чтобы вы могли определять тесты для ваших методов класса внутри самого класса. Вот простой пример:Должны ли модульные тесты быть объявлены встроенными?
using System.Diagnostics;
using NUnit.Framework;
namespace ClassLibrary1
{
public class Class1
{
public static int AddTwoNumbers(int x, int y)
{
return x + y;
}
[Conditional("DEBUG")]
[TestCase(1, 1, 2)]
[TestCase(1, 2, 3)]
[TestCase(2, 1, 3)]
[TestCase(11, 7, 18)]
public static void TestAddTwoNumbers(int x, int y, int sum)
{
int actual = AddTwoNumbers(x, y);
Assert.AreEqual(sum, actual);
}
}
}
Делая это, вы можете создать отладки сборки, которая будет запускать тесты и сборочное производство со всеми его раздели, подобно тому, как FAKE can build projects. Вопрос в том, должен ли ты? Это хорошая практика? Почему или почему нет?
Вы также обнаружите, что этот пример фактически не работает, как я ожидаю. Я не уверен, почему атрибут позволяет скомпилировать метод тестирования. Есть идеи о том, почему?
Спасибо, Джон. Я только что осознал свою ошибку, ожидая, что метод не будет скомпилирован. –
Отмечая это как ответ о том, что не тестировать фактический производственный код, он должен быть точкой торможения. –
@Jon; Может ли следующее предложение изменить вашу оценку вообще: (1) поместить тестовые сценарии в строку с конструкцией «#if XXX» (2) во время сборки сборки с включенными тестами и исключенными (= prod) (3) использовать только сборку отладки для запуска содержащихся тестовых примеров со второй сборкой, которая не включает их. Преимущества: (1) вы можете иметь свои тестовые примеры в непосредственной близости от проверяемого кода (2) вы можете развернуть тестируемую сборку, которая не загромождена испытаниями – jerryjvl