У нас всё настолько просто, насколько возможно. Даже и рассказывать особо нечего
Поскольку у нас всё больше джанга, то ничего стороннего не используем — встроенной в фреймоворк поддержки юнит-тестировнаия достаточно.
Основным отличием от прочитанного мной ранее о тестировании и от чужих тестов вообще есть максимальная атомарность отдельных тестов, а так же максимальная ясность в описании тестируемого поведения кода. Стараемся чётко определять какой слой тестируем — от этого зависит какие детали реализации могут быть известны тесту. (Грубо говоря, тесты у нас разделены на юнит-тесты (low-level), acceptance тесты (hight-level) и integration тесты (зависит от контекста))
Пример accepted теста:
class ProfileBeginDownloadTest(BaseViewTest):
def test_should_redirect_to_login_page_when_user_was_not_previously_logged_in(self):
response = self.client.get("/panel/profile/begindownload/poppy/ie/")
self.assertRedirect(response, "http://testserver/panel/login/?next=/panel/profile/begindownload/poppy/ie/")
def test_should_response_with_404_when_download_requested_for_non_supported_browser(self):
self._login()
response = self.client.get("/panel/profile/begindownload/Consumer Input/opera/")
self.assertEquals(404, response.status_code)
def test_should_response_with_ie_software_download_redirect_for_ie_browser(self):
self._login()
response = self.client.get("/panel/profile/begindownload/Consumer Input/ie/")
self.assertRedirect(response, ConsumerInputPanels.objects.getIESoftwarePath("poppy"))
Обычного юнит-теста
class AgeValidatorTest(TestCase):
def test_should_fail_when_non_numeric_value_passed(self):
self.failUnlessRaises(ValidationError, age_validator, "sixteen")
def test_should_fail_when_less_than_minimum_age_passed(self):
self.failUnlessRaises(ValidationError, age_validator, "17")
def test_should_fail_when_greater_than_maximum_age_passed(self):
self.failUnlessRaises(ValidationError, age_validator, "111")
def test_should_pass_when_minimum_age_passed(self):
age_validator("18")
def test_should_pass_when_greater_than_minimum_age_passed(self):
age_validator("50")
def test_should_pass_when_maximum_age_passed(self):
age_validator("110")
И integration тест
class ValidateApiUserAgentDataMapperTest(TestCase):
fixtures = ["test_panels.json"]
def setUp(self):
self.panel = ConsumerInputPanels.objects.get(id="poppy")
self.invalid_error_code = 1
self.mapper = ValidateApiUserAgentDataMapper(self.panel, self.invalid_error_code)
def test_should_pass_validation_when_user_valid_agent_parameter_passed(self):
self.mapper.collect_data({"user_agent": self.VALID_USER_AGENT})
self.mapper.validate()
def test_should_fail_validation_when_user_invalid_agent_parameter_passed(self):
self.mapper.collect_data({"user_agent": self.INVALID_USER_AGENT})
self.failUnlessRaises(DataMapperValidationError, self.mapper.validate)