2010-07-30 25 views
13

Tôi có một số phương pháp được viết thành đối tượng django.test.TestCase mà tôi muốn chạy từ manage.py shell trên cơ sở dữ liệu thực của tôi. Nhưng khi tôi cố gắng để nhanh chóng các đối tượng TestCase để chạy các phương pháp thử nghiệm, tôi nhận được lỗi này:Làm cách nào để chạy một django TestCase theo cách thủ công/chống lại cơ sở dữ liệu khác?

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

Có cách nào để nhanh chóng TestCase đối tượng? Hoặc là có một cách để chạy một phương pháp thử nghiệm đối với một cơ sở dữ liệu không kiểm tra?

Trả lời

1

Từ Django testing docs:

Running tests

Once you've written tests, run them using the test subcommand of your project's manage.py utility:

$ ./manage.py test

By default, this will run every test in every application in INSTALLED_APPS. If you only want to run tests for a particular application, add the application name to the command line. For example, if your INSTALLED_APPS contains 'myproject.polls' and 'myproject.animals', you can run the myproject.animals unit tests alone with this command:

$ ./manage.py test animals

Note that we used animals, not myproject.animals. New in Django 1.0: You can now choose which test to run.

You can be even more specific by naming an individual test case. To run a single test case in an application (for example, the AnimalTestCase described in the "Writing unit tests" section), add the name of the test case to the label on the command line:

$ ./manage.py test animals.AnimalTestCase

And it gets even more granular than that! To run a single test method inside a test case, add the name of the test method to the label:

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

Ví dụ cuối cùng nên được áp dụng trong trường hợp của bạn.

Nếu đây là những gì bạn đang làm, bạn sẽ cần đăng mô tả chi tiết hơn về mã được sử dụng trong trường hợp thử nghiệm của bạn.

+0

Chắc chắn, nhưng điều đó tạo ra một cơ sở dữ liệu thử nghiệm mới để chạy ngược lại. Làm cách nào để chạy nó trên cơ sở dữ liệu chính (không kiểm tra)? – Leopd

11

Đây là phương pháp tôi đã tìm thấy gần đây. Tôi chưa tìm thấy gì tốt hơn.

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 

Theo tài liệu, chúng ta nên gọi setup_test_environment() khi chạy thử nghiệm thủ công. django.test sử dụng unittest để thử nghiệm để chúng tôi có thể sử dụng TestResult từ unittest để nắm bắt kết quả khi chạy thử nghiệm.

Trong Django 1.2, DjangoTestRunner có thể được sử dụng để kiểm tra có cấu trúc hơn. Tôi chưa thử điều này.

+1

Khi tôi làm điều này, TestCase của tôi không thể truy cập self.client. Ngoài ra là nó có thể chạy tất cả các chức năng kiểm tra bên trong của TestCase mà không fiddling với getattr vv? – pielgrzym

+1

những gì tôi thực sự muốn là chạy trường hợp thử nghiệm theo pdb. – mcr

+0

Điều này thật tuyệt vời, cảm ơn bạn! –

1

Tôi chạy vào điều này, và làm việc ra các giải pháp sau đây:

Trong myapp bạn/tests.py, thiết lập những điều như thế này:

# 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(), .. ]) 

Bạn chạy thử nghiệm này với

~$ unit2 myapp.tests.runNonDjangoTests 

Để biết thêm thông tin, hãy xem http://pypi.python.org/pypi/unittest2

Điều này cũng cho phép bạn chạy thử nghiệm đơn vị đối với cơ sở dữ liệu chính, với tất cả các tác dụng phụ có khả năng phá hoại. Lưu ý rằng unit2 khá nguy hiểm trong ngữ cảnh này, nếu bạn gọi unit2 myapp.tests, nó sẽ chạy tất cả các kiểm tra Django bình thường của bạn mà không dàn dựng chúng vào cơ sở dữ liệu thử nghiệm.

2

Vấn đề "runTest" thường xuất hiện khi mọi người bỏ qua thực tế là unittest.TestCase không có đối số mặc định trong hàm tạo của nó. Có một cái nhìn tại lib/python/unittest/case.py

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

Chú ý rằng baseclass "TestCase" không cung cấp một cài đặt mặc định của "def runTest" nhưng nó nethertheless cố gắng gọi nó. Đó là nơi lỗi xuất phát. Sự nhầm lẫn thực tế xuất phát từ thực tế là việc sử dụng "unittest.main()" không cần phương thức runTest nhưng nó vẫn sẽ gọi tất cả các hàm "def test *". Điều này làm việc ... nhưng không phải vì một hành vi mặc định của TestCase nhưng mã kiểm tra từ unittest.chính - điều này đang làm một cái gì đó như sau:

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) 

Trả lời câu hỏi ban đầu: "Tôi có một số phương pháp ghi vào một django.test.TestCase": bạn cần phải thêm từng phương pháp riêng rẽ vào một TestSuite bằng cách sử dụng TestClass của bạn và cung cấp tên phương thức đích làm đối số đầu tiên khi tạo đối tượng.

Các vấn đề liên quan