Ну, в реальном мире вы бы предпочли работать наоборот: вы бы сделали TDD. Значение: вы думаете о (идеально небольшой) функции, которую должен иметь ваш производственный код. Затем вы пишете тест для этого и проверяете, что тест не пройден. Затем вы реализуете функцию, и теперь тест должен пройти.
Написание тестов «по фактам» чаще всего менее полезно. Но в целом: ничего страшного. Вы можете посмотреть на свой код и понаблюдать за тем, что делает. Затем вы пишете тесты, чтобы проверить это поведение.
как:
@Test(expected=IllegalArgumentException.class)
public void testWithNegativeCapacity() {
new HashMap<String, String>(-1, 0.5);
}
Сначала вы пишете тесты, которые проверяют, что ваш код, который проверяет вводимые данные, работает как положено.
Тогда вы продолжите, например, как
@Test
public void testForExpectedCapacity() {
assertThat(new HashMap<String, String>(10, 0.5).getCapacity(), is(whatever));
}
Где:
- assertЭто один из множества «утверждений», которые вы можете использовать
is()
- это средство сравнения подколенного сухожилия, которое вы используете с assertThat, что приводит к читаемому тестовому коду
- независимо от того, будет ожидаемым значением емкости, при вызове этого конструктора с 10 и 0,5 (мне лень вычислять реальный ожидаемый результат)
Наконец: конечно, вы можете посмотреть на реализацию производственного кода для получения тестов. Но вы также должны посмотреть на контракт этого кода.
Например, его документация: попытайтесь понять, что код должен делать, и напишите тесты, которые проверяют, действительно ли эти утверждения «когда вы делаете это, код выполняет» действительно выполняются.
Обе стороны важны, и только вместе вы можете получить полный набор тестов. Вы хотите убедиться, что код делает то, что должен, и вы хотите убедиться, что «как это сделано» правильно!