Chạy một trường hợp thử nghiệm cụ thể trong Django khi ứng dụng của bạn có thư mục kiểm tra


165

Tài liệu Django ( http://docs.djangoproject.com/en/1.3/topics/testing/#rasty-tests ) nói rằng bạn có thể chạy các trường hợp thử nghiệm riêng lẻ bằng cách chỉ định chúng:

$ ./manage.py test animals.AnimalTestCase

Điều này giả định rằng bạn có các bài kiểm tra của mình trong tệp tests.txt trong ứng dụng Django. Nếu điều này là đúng, thì lệnh này hoạt động như mong đợi.

Tôi có các bài kiểm tra cho ứng dụng Django trong thư mục kiểm tra:

my_project/apps/my_app/
├── __init__.py
├── tests
   ├── __init__.py
   ├── field_tests.py
   ├── storage_tests.py
├── urls.py
├── utils.py
└── views.py

Các tests/__init__.pytập tin có một) chức năng (bộ:

import unittest

from my_project.apps.my_app.tests import field_tests, storage_tests

def suite():
    tests_loader = unittest.TestLoader().loadTestsFromModule
    test_suites = []
    test_suites.append(tests_loader(field_tests))
    test_suites.append(tests_loader(storage_tests))
    return unittest.TestSuite(test_suites)

Để chạy thử nghiệm tôi làm:

$ ./manage.py test my_app

Cố gắng chỉ định một trường hợp thử nghiệm riêng lẻ làm tăng ngoại lệ:

$ ./manage.py test my_app.tests.storage_tests.StorageTestCase
...
ValueError: Test label 'my_app.tests.storage_tests.StorageTestCase' should be of the form app.TestCase or app.TestCase.test_method

Tôi đã cố gắng làm những gì mà thông báo ngoại lệ nói:

$ ./manage.py test my_app.StorageTestCase
...
ValueError: Test label 'my_app.StorageTestCase' does not refer to a test

Làm cách nào để chỉ định một trường hợp thử nghiệm riêng lẻ khi các thử nghiệm của tôi nằm trong nhiều tệp?

Câu trả lời:


156

Thanh toán django-mũi . Nó cho phép bạn chỉ định các bài kiểm tra để chạy như sau:

python manage.py test another.test:TestCase.test_method

hoặc như đã lưu ý trong các bình luận, hãy sử dụng cú pháp:

python manage.py test another.test.TestCase.test_method

Cảm ơn @sdolan. Gặp phải vấn đề tương tự như hekevintran. Chuyển sang django-mũi và nó đã khắc phục vấn đề đó, cũng hoạt động tốt hơn nhiều so với trình chạy thử Django mặc định.
LeeMobile

Điều này chạy thử nghiệm, nhưng làm thế nào để chạy toàn bộ TestCase?
jMstyle

5
@jMyles:another.test:TestCase
Sam Dolan

4
Những người chú ý như tôi dán một cách mù quáng từ Stackoverflow: Điều này sẽ xảy ra lỗi khi không có plugin được đề cập, sử dụng cú pháp được mô tả trong câu trả lời khác (. Thay vì :) hoạt động trong Django 1.6+.
Andy Smith

1
Tôi đã đánh giá thấp câu trả lời này bởi vì nó thực sự không trả lời câu hỏi của OP, đó là cách thực hiện điều này trong Django. Thay vào đó, nó chỉ gợi ý chuyển sang Nosetest
Josh Brown

175

Kể từ Django 1.6, bạn có thể chạy một trường hợp thử nghiệm hoàn chỉnh hoặc thử nghiệm đơn lẻ, sử dụng ký hiệu chấm hoàn chỉnh cho thành phần bạn muốn chạy.

Phát hiện kiểm tra tự động bây giờ sẽ tìm thấy các kiểm tra trong bất kỳ tệp nào bắt đầu bằng kiểm tra trong thư mục làm việc, vì vậy giải quyết câu hỏi bạn sẽ phải đổi tên các tệp của mình, nhưng bây giờ bạn có thể giữ chúng trong thư mục bạn muốn. Nếu bạn muốn sử dụng tên tệp tùy chỉnh, bạn có thể chỉ định một mẫu (trình chạy thử Django mặc định) với cờ tùy chọn --pattern="my_pattern_*.py".

Vì vậy, nếu bạn đang ở trong manage.pythư mục của mình và muốn chạy thử nghiệm test_abên trong TestCaselớp con Abên trong một tệp tests.pytrong ứng dụng / mô-đun, examplebạn sẽ làm:

python manage.py test example.tests.A.test_a

Nếu bạn không muốn bao gồm một phụ thuộc và ở Django 1.6 trở lên thì đó là cách bạn làm điều đó.

Xem tài liệu Django để biết thêm thông tin


Rất vui khi thấy tính năng này được tích hợp vào Django.
hekevintran

Tôi hoàn toàn không thể làm việc này: error: option --pattern not recognizedinvalid command name
địa lý

Điều này hoạt động rất tốt trong Django v3!
Kirk

11

Tôi đã có vấn đề này bản thân mình và tìm thấy câu hỏi này, trong trường hợp có ai khác đi cùng, đây là những gì tôi đã đào lên. DjangoTestSuiteRuner sử dụng một phương thức gọi là build_test (nhãn) để tìm ra trường hợp thử nghiệm nào để chạy dựa trên nhãn. Nhìn vào phương pháp này, hóa ra họ đang thực hiện một getattr () trên mô-đun "mô hình" hoặc "thử nghiệm". Điều này có nghĩa là nếu bạn trả về một bộ, trình chạy thử không tìm kiếm các trường hợp thử nghiệm của bạn trong bộ đó, thì nó chỉ tìm trong một trong các mô-đun đó.

Cách giải quyết nhanh là sử dụng __init__.pyđể nhập trực tiếp các bài kiểm tra của bạn thay vì xác định một bộ. Việc biến chúng thành một phần của mô-đun "thử nghiệm" và vì vậy build_test (nhãn) có thể tìm thấy chúng.

Đối với ví dụ của bạn ở trên, tests/__init__.pychỉ nên chứa:

from field_tests import *
from storage_tests import *

Điều này không phải là rất thanh lịch và tất nhiên nếu bạn đang cố gắng làm một cái gì đó phức tạp hơn với bộ của bạn thì điều này sẽ không hoạt động, nhưng nó sẽ cho trường hợp này.


11

Điều này sẽ làm việc-

python manage.py test my_app.tests.storage_tests

4

Tôi cũng gặp phải vấn đề này và thay vì sử dụng django-mũi, tôi đã theo liên kết này tại đây: http://www.pioverpi.net/2010/03/10/ Organizing-django-tests-into- Folders / . Bạn cần mở init .py và nhập các bài kiểm tra của bạn.

Ví dụ trong init .py:from unique_test_file import *


3

Đặt mã này vào __init__.py của bạn và nó sẽ nhập tất cả các lớp kiểm tra trong gói và gói phụ. Điều này sẽ cho phép bạn chạy các thử nghiệm cụ thể mà không cần nhập thủ công mọi tệp.

import pkgutil
import unittest

for loader, module_name, is_pkg in pkgutil.walk_packages(__path__):
    module = loader.find_module(module_name).load_module(module_name)
    for name in dir(module):
        obj = getattr(module, name)
        if isinstance(obj, type) and issubclass(obj, unittest.case.TestCase):
            exec ('%s = obj' % obj.__name__)

Tương tự, đối với bộ thử nghiệm của bạn, bạn chỉ cần sử dụng:

def suite():   
    return unittest.TestLoader().discover("appname.tests", pattern="*.py")

Bây giờ tất cả những gì bạn phải làm cho các bài kiểm tra mới là viết chúng và đảm bảo chúng nằm trong thư mục kiểm tra. Không còn bảo trì tẻ nhạt của hàng nhập khẩu!

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.