Как запустить django TestCase вручную / для другой базы данных? - PullRequest
14 голосов
/ 30 июля 2010

У меня есть несколько методов, записанных в django.test.TestCase объект, который я хотел бы запустить из manage.py shell в моей реальной базе данных.Но когда я пытаюсь создать экземпляр объекта TestCase для запуска тестового метода, я получаю такую ​​ошибку:

ValueError: no such test method in <class 'track.tests.MentionTests'>: runTest

Есть ли способ создания экземпляров TestCase объектов?Или есть способ запустить тестовый метод для не тестовой базы данных?

Ответы [ 4 ]

13 голосов
/ 25 января 2011

Вот метод, который я недавно нашел.Я не нашел ничего лучшего.

from django.test.utils import setup_test_environment
from unittest import TestResult
from my_app.tests import TheTestWeWantToRun

setup_test_environment()
t = TheTestWeWantToRun('test_function_we_want_to_run')
r = TestResult()
t.run(r)
r.testsRun # prints the number of tests that were run (should be 1)
r.errors + r.failures # prints a list of the errors and failures

Согласно документам, мы должны вызывать setup_test_environment() при ручном запуске тестов.django.test использует unittest для тестирования, поэтому мы можем использовать TestResult из unittest для получения результатов при запуске теста.

В Django 1.2, DjangoTestRunner можно использовать для более структурированного тестирования.Я еще не пробовал это.

2 голосов
/ 25 апреля 2013

Проблема «runTest» обычно возникает, поскольку люди упускают из виду тот факт, что unittest.TestCase имеет аргумент по умолчанию в своем конструкторе.Взгляните на lib / python / unittest / case.py

class TestCase:
    def __init__(self, methodName='runTest'):

Обратите внимание, что базовый класс "TestCase" не обеспечивает реализацию по умолчанию "def runTest", но, тем не менее, не пытается его вызвать.Вот откуда возникает ошибка.Фактическая путаница возникает из-за того, что для использования unittest.main () не требуется метод runTest, но он по-прежнему будет вызывать все функции def test *.Это работает ... но не из-за поведения по умолчанию TestCase, а из-за кода проверки из unittest.main - это делает что-то вроде следующего:

class MyTest(unittest.TestCase):
    def test_001(self):
        print "ok"

if __name__ == "__main__":
     suite = unittest.TestSuite()
     for method in dir(MyTest):
         if method.startswith("test"):
             suite.addTest(MyTest(method))
     unittest.TextTestRunner().run(suite)

Отвечая на оригинальный вопрос "У меня есть несколько методов, написанныхв django.test.TestCase ": вам нужно добавить каждый метод индивидуально в набор тестов, используя ваш тестовый класс и указав имя целевого метода в качестве первого аргумента при создании объекта.

1 голос
/ 18 апреля 2012

Я столкнулся с этим и разработал следующее решение:

В вашем myapp / tests.py установите все так:

# get the straight-up Python unittest without the Django machinery                                                                                                                                                                                                                
# NOTE: this is unittest2, a backport of unit testing features from Python 2.7                                                                                                                                                                                                
# (running 2.6 at the time of writing)                                                                                                                                                                                            
from django.utils import unittest
# get the Django wraps                                                                                                                                                                         
from django.test import TestCase as DjangoTestCase

# [..]
# your normal Django unit tests, inheriting from DjangoTestCase
# [..]

class MyTest( unittest.TestCase ):
    def runTest( self ): # NOTE: required name
        self.failUnless( True is True )

def runNonDjangoTests():
    return MyTest() # or unittest.TestSuite( [ MyTest(), .. ] )

Вы запускаете этот тест с

~$ unit2 myapp.tests.runNonDjangoTests

Подробнее см. http://pypi.python.org/pypi/unittest2

Это также позволяет запускать модульные тесты для основной базы данных со всеми потенциально разрушительными побочными эффектами. Обратите внимание, что unit2 довольно опасно в этом контексте, если вы звоните unit2 myapp.tests он будет запускать все ваши обычные тесты Django без помещения их в тестовую базу данных.

1 голос
/ 31 июля 2010

Из документации по тестированию Django :

Выполнение тестов

Как только вы написали тесты, запустите их используя тестовую подкоманду вашего Утилита проекта manage.py:

$ ./manage.py test

По умолчанию это будет запускать каждый тест в каждом приложении в INSTALLED_APPS. Если вы хотите только запустить тесты для конкретного приложение, добавьте имя приложения в командной строке. Например, если ваш INSTALLED_APPS содержит myproject.polls и 'myproject.animals', вы можете запустить Только юнит-тесты myproject.animals с помощью этой команды:

$ ./manage.py подопытных животных

Обратите внимание, что мы использовали животных, а не myproject.animals. Новое в Django 1.0: Теперь вы можете выбрать тест для запуска.

Вы можете быть еще более конкретным, называя индивидуальный контрольный пример. Бежать один тестовый пример в приложении (например, AnimalTestCase описано в разделе «Написание юнит-тестов» раздел), добавьте название теста регистр к метке в командной строке:

$ ./manage.py test animals.AnimalTestCase

И это становится еще более гранулированным, чем тот! Чтобы запустить один метод тестирования внутри теста добавьте имя Метод испытания на этикетке:

$ ./manage.py test animals.AnimalTestCase.testFluffyAnimals

Последний пример должен быть применим в вашем случае.

Если вы этим занимаетесь, вам нужно опубликовать более подробное описание кода, используемого в вашем тестовом примере.

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