Какие популярные соглашения об именах для модульных тестов?

Общий

  • Следуйте одним и тем же стандартам для всех тестов.
  • Четко определите, что такое каждое состояние теста.
  • Будьте конкретны в отношении ожидаемого поведения.

Примеры

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 ()

Другой

  • Завершите имена методов с помощью Тест
  • Имена методов запуска с именем класса

См. Поведенческая разработка.

Wedge 19.09.2008 00:01
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
209
1
92 323
7
Перейти к ответу Данный вопрос помечен как решенный

Ответы 7

Пока вы следуете единственной практике, это не имеет значения. Как правило, я пишу единый модульный тест для метода, который охватывает все варианты метода (у меня есть простые методы;), а затем пишу более сложные наборы тестов для методов, которые в этом нуждаются. Таким образом, моя структура именования обычно является тестовой (пережиток JUnit 3).

Первый набор имен для меня более читабелен, поскольку CamelCasing разделяет слова, а нижние полосы - отдельные части схемы именования.

Я также стараюсь включать "Test" где-нибудь, либо в имя функции, либо в окружающее пространство имен или класс.

@Frank methodName = camelCase MethodName = PascalCase

Metro Smurf 14.06.2009 01:41

@ metro-smurf: интересное различие, я никогда не слышал, чтобы использовался термин PascalCase, и делаю это уже давно. Я только вижу, что термин PascalCase появляется в кругах разработчиков Microsoft, это то, чем вы занимаетесь?

Frank Szczerba 19.06.2009 23:02

История вокруг Pascal Casing и Camel Casing (от: Брэд Абрамс - blogs.msdn.com/brada/archive/2004/02/03/67024.aspx) ... «При первоначальном дизайне Framework у нас были сотни часов споров о стиле именования. Чтобы облегчить эти дебаты, мы придумали ряд терминов. Вместе с Андерсом Хайльсберг (первоначальный разработчик Turbo Pascal), ключевой член команды разработчиков, неудивительно, что мы выбрали термин Pascal Casing для стиля корпуса, популяризированного языком программирования Pascal ».

Riegardt Steyn 05.02.2013 17:13
Ответ принят как подходящий

Я в значительной степени поддерживаю вас в этом одном человеке. Вы использовали следующие соглашения об именах:

  • Ясно, что такое каждое тестовое состояние.
  • Конкретно об ожидаемом поведении.

Что еще нужно от имени теста?

В отличие от Ответ Рэя я не думаю, что префикс Тест необходим. Это тестовый код, мы это знаем. Если вам нужно сделать это для идентификации кода, то у вас большие проблемы, ваш тестовый код не следует путать с вашим производственным кодом.

Что до длины и использования подчеркивания, его тестовый код, кого это, черт возьми, волнует? Только вы и ваша команда увидите его, если он читабельный и ясно показывает, что делает тест, продолжайте! :)

Тем не менее, я все еще новичок в тестировании и веду блог о моих приключениях с ним :)

Незначительное противоречие «до тех пор, пока оно читабельно и понятно» и «кого ... волнует». Что ж, всех волнует, когда это не читается и не понятно, поэтому это важно. :-)

David Victor 31.05.2012 15:41

Еще один дополнительный аргумент для префикса. Когда вы ищете файл в IDE, вы можете легко выполнить поиск тестовых примеров, начав с Test и имени вашего класса. Если имя класса и имя тестового класса совпадают, нам всегда придется делать паузу и читать путь к двум файлам.

THIS USER NEEDS HELP 12.01.2018 03:26

@THISUSERNEEDSHELP Я думаю, что вашу точку зрения можно легко преодолеть, имея хорошую структуру папок, такую ​​как src / libs & SRC / тесты. Я знаю, что некоторые среды выполнения тестов требуют префикса, такого как тест, для идентификации тестового кода, поэтому в этих случаях не удастся избежать, но в остальном это может быть повторяющийся префикс не требуется.

negrotico19 30.01.2019 20:45

@ negrotico19 Я думаю о случае, как в IntelliJ, когда вы используете Search Everywhere (сдвиг сдвига) или Find a Class By Name (CMD O). Я понимаю, что буду различается либо структурой папок, либо структурой модуля, но когда мы что-то ищем, мы уже знаем, что хотим искать. Например, если я ищу тест, я хочу ограничить свой поиск test, а затем искать имя, а не искать имя, и тогда отфильтровывает тест вручную на глаз. Это небольшая разница, но гораздо проще "протестировать [название класса]", чтобы было только одно всплывающее окно, что снизило умственную нагрузку.

THIS USER NEEDS HELP 31.01.2019 21:49

Я называю свои методы тестирования, как и другие методы, с использованием «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 ()

bryanbcook 02.09.2009 18:55

Мне это не нравится, потому что в нем нет ожидаемого поведения

Johannes Rudolph 03.09.2009 13:25

Я использую префикс «T» для тестовых пространств имен, классов и методов.

Я стараюсь быть аккуратным и создаю папки, которые реплицируют пространства имен, затем создаю папку тестов или отдельный проект для тестов и реплицирую производственную структуру для базовых тестов:

AProj
   Objects
      AnObj
         AProp
   Misc
      Functions
         AFunc
   Tests
      TObjects
         TAnObj
            TAnObjsAreEqualUnderCondition
      TMisc
         TFunctions
            TFuncBehavesUnderCondition

Я легко вижу, что что-то является тестом, я точно знаю, к какому исходному коду он относится (если вы не можете с этим разобраться, значит, тест в любом случае слишком запутан).

Это похоже на соглашение об именах интерфейсов (я имею в виду, вы не запутаетесь с вещами, начинающимися с «I», и не с «T»).

Легко просто скомпилировать с тестами или без них.

В любом случае это хорошо в теории и неплохо работает для небольших проектов.

Интересный подход. Некоторые люди могут возразить, что префикс T противоречит соглашению, которое вы используете в дженериках (например, func (T1, T2, TResult)), но мне лично все равно, пока в команде есть консенсус. Имена короткие, что также упрощает чтение.

stung 11.01.2011 01:00

Для меня тоже венгерский (нотация). Кроме того, как было сказано, префикс T используется для параметров универсального типа.

Danny Varod 21.06.2011 12:14

Я согласен, венгерская нотация устарела, и из-за конфликта со стандартными параметрами универсального типа я не вижу исключения, применяемого в этом случае (например, для интерфейсов).

SonOfPirate 13.12.2011 17:19

Это также стоит прочитать: Структурирование модульных тестов

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. С тех пор эта структура стала моей любимой.

angularsen 11.03.2015 15:44

Имеет ли значение, что имя становится действительно длинным с подходом MethodName_StateUnderTest_ExpectedBehavior? Например, «InitializeApiConfiguration_MissingApiKey_IllegalArgumentExc‌ eption». Это действительно хорошее название для теста?

portfoliobuilder 21.06.2019 20:03

Я обычно использую соглашение 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.

Другие вопросы по теме