1) MethodName_StateUnderTest_ExpectedBehavior
Public void Sum_NegativeNumberAs1stParam_ExceptionThrown()
Public void Sum_NegativeNumberAs2ndParam_ExceptionThrown ()
Public void Sum_simpleValues_Calculated ()
Источник: Стандарты именования для модульных тестов
2) Разделение каждого слова подчеркиванием
Public void Sum_Negative_Number_As_1st_Param_Exception_Thrown()
Public void Sum_Negative_Number_As_2nd_Param_Exception_Thrown ()
Public void Sum_Simple_Values_Calculated ()





Пока вы следуете единственной практике, это не имеет значения. Как правило, я пишу единый модульный тест для метода, который охватывает все варианты метода (у меня есть простые методы;), а затем пишу более сложные наборы тестов для методов, которые в этом нуждаются. Таким образом, моя структура именования обычно является тестовой (пережиток JUnit 3).
Первый набор имен для меня более читабелен, поскольку CamelCasing разделяет слова, а нижние полосы - отдельные части схемы именования.
Я также стараюсь включать "Test" где-нибудь, либо в имя функции, либо в окружающее пространство имен или класс.
@Frank methodName = camelCase MethodName = PascalCase
@ metro-smurf: интересное различие, я никогда не слышал, чтобы использовался термин PascalCase, и делаю это уже давно. Я только вижу, что термин PascalCase появляется в кругах разработчиков Microsoft, это то, чем вы занимаетесь?
История вокруг Pascal Casing и Camel Casing (от: Брэд Абрамс - blogs.msdn.com/brada/archive/2004/02/03/67024.aspx) ... «При первоначальном дизайне Framework у нас были сотни часов споров о стиле именования. Чтобы облегчить эти дебаты, мы придумали ряд терминов. Вместе с Андерсом Хайльсберг (первоначальный разработчик Turbo Pascal), ключевой член команды разработчиков, неудивительно, что мы выбрали термин Pascal Casing для стиля корпуса, популяризированного языком программирования Pascal ».
Я в значительной степени поддерживаю вас в этом одном человеке. Вы использовали следующие соглашения об именах:
Что еще нужно от имени теста?
В отличие от Ответ Рэя я не думаю, что префикс Тест необходим. Это тестовый код, мы это знаем. Если вам нужно сделать это для идентификации кода, то у вас большие проблемы, ваш тестовый код не следует путать с вашим производственным кодом.
Что до длины и использования подчеркивания, его тестовый код, кого это, черт возьми, волнует? Только вы и ваша команда увидите его, если он читабельный и ясно показывает, что делает тест, продолжайте! :)
Тем не менее, я все еще новичок в тестировании и веду блог о моих приключениях с ним :)
Незначительное противоречие «до тех пор, пока оно читабельно и понятно» и «кого ... волнует». Что ж, всех волнует, когда это не читается и не понятно, поэтому это важно. :-)
Еще один дополнительный аргумент для префикса. Когда вы ищете файл в IDE, вы можете легко выполнить поиск тестовых примеров, начав с Test и имени вашего класса. Если имя класса и имя тестового класса совпадают, нам всегда придется делать паузу и читать путь к двум файлам.
@THISUSERNEEDSHELP Я думаю, что вашу точку зрения можно легко преодолеть, имея хорошую структуру папок, такую как src / libs & SRC / тесты. Я знаю, что некоторые среды выполнения тестов требуют префикса, такого как тест, для идентификации тестового кода, поэтому в этих случаях не удастся избежать, но в остальном это может быть повторяющийся префикс не требуется.
@ negrotico19 Я думаю о случае, как в IntelliJ, когда вы используете Search Everywhere (сдвиг сдвига) или Find a Class By Name (CMD O). Я понимаю, что буду различается либо структурой папок, либо структурой модуля, но когда мы что-то ищем, мы уже знаем, что хотим искать. Например, если я ищу тест, я хочу ограничить свой поиск test, а затем искать имя, а не искать имя, и тогда отфильтровывает тест вручную на глаз. Это небольшая разница, но гораздо проще "протестировать [название класса]", чтобы было только одно всплывающее окно, что снизило умственную нагрузку.
Я называю свои методы тестирования, как и другие методы, с использованием «PascalCasing» без каких-либо подчеркиваний или разделителей. Я оставляю постфикс Тест для метода, потому что он не добавляет значения. То, что метод является тестовым, указывается атрибутом Метод испытания.
[TestMethod]
public void CanCountAllItems() {
// Test the total count of items in collection.
}
В связи с тем, что каждый тестовый класс должен тестировать только один другой класс, я оставляю имя класса вне имени метода. Имя класса, содержащего тестовые методы, называется так же, как тестируемый класс, с постфиксом «Тесты».
[TestClass]
public class SuperCollectionTests(){
// Any test methods that test the class SuperCollection
}
Для методов, которые проверяют исключения или действия, которые невозможны, я ставлю перед методом проверки слово Не можешь.
[TestMethod]
[ExpectedException(typeOf(ArgumentException))]
public void CannotAddSameObjectAgain() {
// Cannot add the same object again to the collection.
}
Мое соглашение по именованию основано на статье «Советы TDD: правила и рекомендации по именованию тестов» Брайана Кука. Я нашел эту статью очень полезной.
+1 за ссылку на мой пост - хотя нет необходимости использовать префикс «Тест» в ваших Тестах. Убедитесь, что ваши тесты определяют ожидаемое поведение. Например, CanRetrieveProperCountWhenAddingMultipleItems ()
Мне это не нравится, потому что в нем нет ожидаемого поведения
Я использую префикс «T» для тестовых пространств имен, классов и методов.
Я стараюсь быть аккуратным и создаю папки, которые реплицируют пространства имен, затем создаю папку тестов или отдельный проект для тестов и реплицирую производственную структуру для базовых тестов:
AProj
Objects
AnObj
AProp
Misc
Functions
AFunc
Tests
TObjects
TAnObj
TAnObjsAreEqualUnderCondition
TMisc
TFunctions
TFuncBehavesUnderCondition
Я легко вижу, что что-то является тестом, я точно знаю, к какому исходному коду он относится (если вы не можете с этим разобраться, значит, тест в любом случае слишком запутан).
Это похоже на соглашение об именах интерфейсов (я имею в виду, вы не запутаетесь с вещами, начинающимися с «I», и не с «T»).
Легко просто скомпилировать с тестами или без них.
В любом случае это хорошо в теории и неплохо работает для небольших проектов.
Интересный подход. Некоторые люди могут возразить, что префикс T противоречит соглашению, которое вы используете в дженериках (например, func (T1, T2, TResult)), но мне лично все равно, пока в команде есть консенсус. Имена короткие, что также упрощает чтение.
Для меня тоже венгерский (нотация). Кроме того, как было сказано, префикс T используется для параметров универсального типа.
Я согласен, венгерская нотация устарела, и из-за конфликта со стандартными параметрами универсального типа я не вижу исключения, применяемого в этом случае (например, для интерфейсов).
Это также стоит прочитать: Структурирование модульных тестов
The structure has a test class per class being tested. That’s not so unusual. But what was unusual to me was that he had a nested class for each method being tested.
например
using Xunit;
public class TitleizerFacts
{
public class TheTitleizerMethod
{
[Fact]
public void NullName_ReturnsDefaultTitle()
{
// Test code
}
[Fact]
public void Name_AppendsTitle()
{
// Test code
}
}
public class TheKnightifyMethod
{
[Fact]
public void NullName_ReturnsDefaultTitle()
{
// Test code
}
[Fact]
public void MaleNames_AppendsSir()
{
// Test code
}
[Fact]
public void FemaleNames_AppendsDame()
{
// Test code
}
}
}
И вот почему:
Well for one thing, it’s a nice way to keep tests organized. All the tests (or facts) for a method are grouped together. For example, if you use the CTRL+M, CTRL+O shortcut to collapse method bodies, you can easily scan your tests and read them like a spec for your code.
Мне тоже нравится такой подход:
MethodName_StateUnderTest_ExpectedBehavior
Так что, возможно, приспособьтесь к:
StateUnderTest_ExpectedBehavior
Потому что каждый тест уже будет во вложенном классе
Те, кто использовал средство запуска тестов Resharper в Visual Studio, исправили ошибки с помощью вложенных тестовых классов в 8.x. С тех пор эта структура стала моей любимой.
Имеет ли значение, что имя становится действительно длинным с подходом MethodName_StateUnderTest_ExpectedBehavior? Например, «InitializeApiConfiguration_MissingApiKey_IllegalArgumentExc eption». Это действительно хорошее название для теста?
Я обычно использую соглашение MethodName_DoesWhat_WhenTheseConditions, например:
Sum_ThrowsException_WhenNegativeNumberAs1stParam
Однако я часто вижу, что имя теста должно соответствовать структуре модульного тестирования
Что также следует синтаксису BDD / Gherkin:
что означало бы назвать тест следующим образом: UnderTheseTestConditions_WhenIDoThis_ThenIGetThis
так что к вашему примеру:
WhenNegativeNumberAs1stParam_Sum_ThrowsAnException
Однако я предпочитаю сначала указывать имя тестируемого метода, потому что тогда тесты могут быть расположены в алфавитном порядке или отображаться в алфавитном порядке в раскрывающемся списке элементов в VisStudio, и все тесты для 1 метода сгруппированы вместе.
В любом случае, мне нравится разделять основной разделы имени теста подчеркиванием, в отличие от каждого слово, потому что я думаю, что это облегчает чтение и понимание сути теста.
Другими словами, мне нравится: Sum_ThrowsException_WhenNegativeNumberAs1stParam лучше, чем Sum_Throws_Exception_When_Negative_Number_As_1st_Param.
См. Поведенческая разработка.