Мне трудно понять, почему в большинстве профессиональных кодов TDD, которые я видел, есть только один тест для каждой функции
Я предполагаю, что вы имеете в виду «утверждать», когда говорите «тест». В общем случае тест должен проверять только один «вариант использования» функции. Под «прецедентом» я подразумеваю: путь, по которому код может проходить через операторы потока управления (не забывайте об обработанных исключениях и т. Д.). По сути, вы тестируете все «требования» этой функции. Например, скажем, у вас есть такая функция:
Public Function DoSomething(ByVal foo as Boolean) As Integer
Dim result as integer = 0
If(foo) then
result = MakeRequestToWebServiceA()
Else
result = MakeRequestToWebServiceB()
End If
return result
End Function
В этом случае функция может принимать 2 «варианта использования» или управляющих потока. Эта функция должна иметь как минимум 2 теста для нее. Тот, который принимает foo как true и разветвляет код if (true), и тот, который принимает foo как false и переходит во вторую ветвь. Если у вас есть больше, если операторы или потоки кода могут идти, тогда это потребует больше тестов. Это по нескольким причинам. Самым важным для меня является то, что без него тесты были бы слишком сложными и трудными для чтения. Есть и другие причины, например, в случае вышеупомянутой функции поток управления основан на входном параметре, что означает, что вы должны дважды вызвать функцию, чтобы протестировать все пути кода. Вам никогда не следует вызывать функцию более одного раза, которую вы тестируете в своем тестовом IMO.
но я пытаюсь найти имена функций, чтобы различать разные тесты, так как многие из них очень похожи
Может, ты слишком обдумываешь это? Не бойтесь писать сумасшедшие, слишком многословные имена для вашей тестовой функции. Что бы ни делал этот тест, напишите его на английском языке, используйте подчеркивание и придумайте набор стандартов для имен, чтобы кто-то еще, глядя на код (включая вас через 6 месяцев), мог легко понять, что он делает. Помните, что на самом деле вам никогда не придется вызывать эту функцию самостоятельно (по крайней мере, в большинстве сред тестирования), поэтому кого это волнует, если ее имя будет содержать 100 символов. Сходить с ума. В приведенном выше примере мои 2 теста будут называться:
DoSomethingTest_TestWhenFooIsTrue_RequestIsMadeToWebServiceA()
DoSomethingTest_TestWhenFooIsFalse_RequestIsMadeToWebServiceB()
Также - это всего лишь общее руководство. Определенно есть случаи, когда у вас будет несколько подтверждений в одном модульном тесте. Это произойдет, когда вы тестируете один и тот же поток управления 1018 *, но при написании утверждений assert необходимо проверить несколько полей. Возьмем, к примеру, тест для функции, которая анализирует CSV-файл в бизнес-объекте с полями Header, Body и Footer:
Public Sub ParseFileTest_TestFileIsParsedCorrectly()
Dim target as new FileParser()
Dim actual as SomeBusinessObject = target.ParseFile(TestHelper.GetTestData("ParseFileTest.csv")))
Assert.Equals(actual.Header,"EXPECTED HEADER FROM TEST DATA FILE")
Assert.Equals(actual.Footer,"EXPECTED FOOTER FROM TEST DATA FILE")
Assert.Equals(actual.Body,"TEST DATA BODY")
End Sub
Здесь мы действительно тестируем один и тот же вариант использования, но нам нужно было несколько утверждений, чтобы проверить все наши данные и убедиться, что наш код действительно работает.
-Drew