Сколько модульных тестов я должен записать на функцию/метод?

NullPointerException s - исключения, возникающие при попытке использовать ссылку, которая указывает на отсутствие местоположения в памяти (null), как если бы она ссылалась на объект. Вызов метода по нулевой ссылке или попытка получить доступ к полю нулевой ссылки вызовет функцию NullPointerException. Они наиболее распространены, но другие способы перечислены на странице NullPointerException javadoc.

Вероятно, самый быстрый пример кода, который я мог бы придумать для иллюстрации NullPointerException, be:

public class Example {

    public static void main(String[] args) {
        Object obj = null;
        obj.hashCode();
    }

}

В первой строке внутри main я явно устанавливаю ссылку Object obj равной null. Это означает, что у меня есть ссылка, но она не указывает на какой-либо объект. После этого я пытаюсь обработать ссылку так, как если бы она указывала на объект, вызывая метод на нем. Это приводит к NullPointerException, потому что нет кода для выполнения в местоположении, на которое указывает ссылка.

(Это техничность, но я думаю, что она упоминает: ссылка, которая указывает на null, равна 't то же, что и указатель C, указывающий на недопустимую ячейку памяти. Нулевой указатель буквально не указывает на в любом месте , который отличается от указаний на местоположение, которое оказывается недопустимым.)

23
задан Dave Schweisguth 25 May 2014 в 15:51
поделиться

12 ответов

Один тест на проверку и супер описательные имена, на экземпляр:

@Test
public void userCannotVoteDownWhenScoreIsLessThanOneHundred() {
 ...
}

И только одно утверждение и использование хороших имен дают мне лучший отчет, когда тест перестал работать. Они кричат мне: "Вы нарушили ТО правило!".

36
ответ дан Dave Schweisguth 29 November 2019 в 01:20
поделиться

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

Обычно для одной функции, у меня есть несколько "солнечных дней" тесты и один или несколько "дождливых дней" сценарий, в зависимости от его сложности.

5
ответ дан philant 29 November 2019 в 01:20
поделиться

BDD (Поведение Управляемая Разработка)

, Хотя я все еще учусь, это - в основном TDD, организовывал/фокусировал вокруг, как Ваше программное обеспечение будет на самом деле использоваться... НЕ, как это будет разработано/создано.

Википедия Общая информация

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

4
ответ дан Justin Bozonier 29 November 2019 в 01:20
поделиться

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

Так, в Python, я полагаю, что тест как это корректен :

def testGetCountReturnsCountAndEnd(self):
    count, endReached = self.handler.getCount()
    self.assertEqual(count, 0)
    self.assertTrue(endReached)

, но этот должен быть , разделяет на два метода тестирования:

def testGetCountReturnsOneAfterPut(self):
    self.assertEqual(self.handler.getCount(), 0)
    self.handler.put('foo')
    self.assertEqual(self.handler.getCount(), 1)

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

3
ответ дан DzinX 29 November 2019 в 01:20
поделиться

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

, Но Вы должны НИКОГДА тест больше чем один метод в одном модульном тесте. Это уменьшает объем работы и ошибку в фиксация Ваш тест в случае, если Ваш API изменяется.

2
ответ дан gizmo 29 November 2019 в 01:20
поделиться

Тестовый сценарий для каждой проверки. Это более детализировано. Это делает намного легче видеть то, что привел к сбою определенный тестовый сценарий.

2
ответ дан TraumaPony 29 November 2019 в 01:20
поделиться

Я предложил бы тестовый сценарий для каждой проверки. Чем больше Вы сохраняете атомарными, тем лучше Ваши результаты!

Хранение нескольких регистраций сингла тесты помогут Вам генерировать отчет для того, сколько функциональности должно быть исправлено.

Остающийся атомарный тестовый сценарий покажет Вам общее качество!

1
ответ дан prakash 29 November 2019 в 01:20
поделиться

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

1
ответ дан David Dibben 29 November 2019 в 01:20
поделиться

В Java/Eclipse/JUnit я использую два исходных каталога (src и тест) с тем же деревом. Если я имею src/com/mycompany/whatever/TestMePlease с методами, которые стоит протестировать (например, deleteAll (List<? > материал), бросает MyException), я создаю test/com/mycompany/whatever/TestMePleaseTest с методами для тестирования различного варианта использования / сценарии:

@Test
public void deleteAllWithNullInput() { ... }

@Test(expect="MyException.class") // not sure about actual syntax here :-P
public void deleteAllWithEmptyInput() { ... }

@Test
public void deleteAllWithSingleLineInput() { ... }

@Test
public void deleteAllWithMultipleLinesInput() { ... }

Имеющие различные проверки более просто обработать для меня.

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

@Test
public void insertAndDelete() { 
    assertTrue(/*stuff does not exist yet*/);
    createStuff();
    assertTrue(/*stuff does exist now*/);
    deleteStuff();
    assertTrue(/*stuff does not exist anymore*/);
}

не знают, существуют ли более умные способы сделать это, сказать Вам истину...

1
ответ дан Manrico Corazzi 29 November 2019 в 01:20
поделиться

Мне нравится иметь тест на регистрацию метода и иметь многозначительное название метода тестирования. Например:

testAddUser_shouldThrowIllegalArgumentExceptionWhenUserIsNull

1
ответ дан Christophe Herreman 29 November 2019 в 01:20
поделиться

Тестовый сценарий на проверку. При именовании метода соответственно он может обеспечить ценную подсказку к проблеме, когда один из этих тестов вызывает отказ регрессии.

0
ответ дан Binil Thomas 29 November 2019 в 01:20
поделиться

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

существует польза шоу подкаста с Andy Leonard на том, что это включает и как сделать это , и если Вы хотели бы немного больше информации, я записал сообщение в блоге на предмете (бесстыдный разъем; o)

0
ответ дан Andrew 29 November 2019 в 01:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: