Подтвердить что ты не робот

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

Общие

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

Примеры

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

Другие

  • Имена конечных методов с тестом
  • Начать имена методов с именем класса
4b9b3361

Ответ 1

Я очень люблю тебя с этим человеком. Соглашения об именах, которые вы использовали:

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

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

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

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

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

Ответ 2

Это также стоит прочитать: Структурирование единиц измерения

Структура тестируемого класса для каждого класса тестируется. Это не так уж необычно. Но для меня было необычным было то, что у него был вложенный класс для каждого тестируемого метода.

например.

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
        }
    }
}

И вот почему:

Ну, во-первых, это хороший способ провести тесты. Все тесты (или факты) для метода группируются вместе. Например, если вы используете сочетание CTRL + M, CTRL + O, чтобы свернуть тела методов, вы можете легко сканировать ваши тесты и читать их как спецификацию для вашего кода.

Мне также нравится этот подход:

MethodName_StateUnderTest_ExpectedBehavior

Так что, возможно, настройтесь на:

StateUnderTest_ExpectedBehavior

Поскольку каждый тест уже будет в вложенном классе

Ответ 3

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

Ответ 4

Я называю свои методы тестирования, как другие методы, используя "PascalCasing" без каких-либо подчеркиваний или разделителей. Я оставляю постфиксный тест для метода, потому что он не добавляет значения. То, что метод является методом тестирования, указывается атрибутом TestMethod.

[TestMethod]
public void CanCountAllItems() {
  // Test the total count of items in collection.
}

В связи с тем, что каждый класс Test должен тестировать только один класс, я оставляю имя класса вне имени метода. Имя класса, содержащего тестовые методы, называется классом, тестируемым с помощью постфикса "Тесты".

[TestClass]
public class SuperCollectionTests(){
    // Any test methods that test the class SuperCollection
}

Для методов, которые проверяют исключения или действия, которые не возможны, я префикс метода проверки с помощью слова Can not.

[TestMethod]
[ExpectedException(typeOf(ArgumentException))]
public void CannotAddSameObjectAgain() {
  // Cannot add the same object again to the collection.
}

Моя инициация именования основана на статье "Советы TDD: правила и рекомендации по определению имен" Брайана Кука. Я нашел эту статью очень полезной.

Ответ 5

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

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

Ответ 6

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

Ответ 7

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

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

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

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

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

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

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