Django TestCase создает новые функции test_ с exec и setattr в setUp()

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

class TestAdminGetViews(TestCase):

  def setUp(self):
    self.factory = RequestFactory()
    self.admin_user = models.UserManager.create_user(email='test@test.com',password='12387343ad!'
        ,user_type=utils.UserTypes.admin.name)
    self.client = Client()  

    #create the test methods programmatically where URLNames.object.name = view.name

    for url in utils.URLNames: #an Enum object

        #is there a view associated with with this URLName?
        if callable(getattr(views,url.name)):
#placeholder code just to see if tests run
            str_function = '''def test_{}(self):\n\tself.assertIs(True,True)\nglobal my_function\nmy_function = test_{}'''.format(url.name, url.name)               
            exec( str_function )
            print( my_function )
            setattr(self,'test_' + url.name,my_function)

    #factory, admin_user, client and all the functions show themselves
    #as being attached to self
    print(str(self.__dict__))

Функция печати показывает, что код работает "успешно". Словарь содержит factory, admin_user и client, которые доступны в жестко запрограммированных функциях test_. Программно созданные функции также отображаются в словаре с правильным именем и именем функции.

Однако тестовая среда Django не запускает программно созданные функции. Зачем?

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

1 ответ

Вы можете попытаться запустить тест следующим образом... это просто демонстрация того, что цикл for может печатать трассировку... я думаю, что с вашим строковым методом test_ и пытаясь сказать python, что функция не будет работать...

import traceback
from django.test import TestCase

class MyTest(TestCase):

    def test_views(self):

        any_error = False
        for url in range(0, 3):
            try:
                print("running: " + str(url))
                # run my test here
                # ...
                self.assertTrue(False) # fail on purpose

            except Exception as e:
                print(str(e))
                any_error = True
                traceback.print_exc()

        if any_error is True:
            raise RuntimeError("some test fails")
Другие вопросы по тегам