Django Tests: увеличить тестыRun counter - PullRequest
4 голосов
/ 03 июня 2019

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

Ran 1 test in 3.456s

Я хотел бы увеличить этот счетчик для каждого цикла, как я могу это сделать?Он использует subTest(), но это не обновляет счетчик (который я считаю параметром testsRun)

мой тест выглядит примерно так

class MyTestCase(TestCase):

   def test_auth_pages(self):
      pages = ['homepage', 'dashboard', 'profile']

      for page in pages:
         with self.subTest():
            # ....testsRun  += 1 
            self.c.login(username='test', password='test')
            response = self.c.get(reverse_lazy(page))
            self.assertEqual(200, response.status_code, msg=page)
            self.c.logout()
            response = self.c.get(reverse_lazy(page))
            self.assertEqual(302, response.status_code, msg=page) 

Ответы [ 2 ]

1 голос
/ 14 июня 2019

Если вы не возражаете против изменения среды тестирования, рассмотрите pytest с пакетом pytest-django. Вы можете легко параметризовать тест, используя @pytest.mark.parametrize:

import pytest

@pytest.mark.parametrize("page_name", ['homepage', 'dashboard', 'profile'])
def test_some_page(page_name, client):
    client.login(username='test', password='test')
    response = client.get(reverse_lazy(page))
    assert response.status_code == 200
    client.logout()
    response = client.get(reverse_lazy(page))
    assert response.status_code == 302

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

class MyTestCase(TestCase):

   def _create_page_test(page_name):
       def test_function(self):
           self.c.login(username='test', password='test')
           response = self.c.get(reverse_lazy(page_name))
           self.assertEqual(200, response.status_code, msg=page_name)
           self.c.logout()
           response = self.c.get(reverse_lazy(page_name))
           self.assertEqual(302, response.status_code, msg=page_name)
        return test_function

    test_homepage = _create_page_test("homepage")
    test_dashboard = _create_page_test("dashboard")
    test_profile = _create_page_test("profile")

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

0 голосов
/ 09 июня 2019

Этого можно добиться с помощью другого набора тестов.

Проверьте генераторы тестов из пакета django-nose

def test_evens():
    for i in range(0, 5):
        yield check_even, i, i*3   # this generates 5 different tests

def check_even(n, nn):
    assert n % 2 == 0 or nn % 2 == 0
...