2008-09-26 34 views
6

Tôi muốn viết các bài kiểm tra có thể cho biết cơ sở dữ liệu có được đồng bộ với tệp models.py của tôi hay không. Trên thực tế tôi đã viết chúng, chỉ để tìm ra rằng django tạo ra một cơ sở dữ liệu mới mỗi khi các thử nghiệm được chạy dựa trên tập tin models.py. Có cách nào tôi có thể thực hiện thử nghiệm models.py sử dụng lược đồ cơ sở dữ liệu hiện tại không? Một trong đó là mysql/postgresql, và không phải là một trong /myapp/models.py?Làm cách nào để kiểm tra lược đồ cơ sở dữ liệu django?

Tôi không quan tâm đến dữ liệu nằm trong cơ sở dữ liệu, tôi chỉ quan tâm đến lược đồ nghĩa là tôi muốn kiểm tra xem bảng trong cơ sở dữ liệu có ít trường hơn lược đồ trong tệp models.py của tôi không .

Tôi đang sử dụng khung không liên quan (thực sự là tiện ích mở rộng django cho nó) nếu điều này có bất kỳ mức độ liên quan nào.

cảm ơn

Trả lời

8

Điều chúng tôi đã ghi đè lên test_runner mặc định để nó không tạo cơ sở dữ liệu mới để kiểm tra. Bằng cách này, nó chạy thử nghiệm đối với bất kỳ cơ sở dữ liệu cục bộ hiện tại của chúng tôi trông như thế nào. Nhưng hãy rất cẩn thận nếu bạn sử dụng phương pháp này vì bất kỳ thay đổi nào đối với dữ liệu bạn thực hiện trong các thử nghiệm sẽ là vĩnh viễn. Tôi đảm bảo rằng tất cả các bài kiểm tra của chúng tôi khôi phục mọi thay đổi về trạng thái ban đầu và giữ phiên bản nguyên sơ của cơ sở dữ liệu của chúng tôi trên máy chủ và sao lưu.

Vì vậy, để làm được điều này bạn cần phải sao chép các phương pháp run_test từ django.test.simple đến một vị trí trong dự án của bạn - tôi đặt tôi trong myproject/test/test_runner.py

Sau đó thực hiện những thay đổi sau đây để phương pháp đó:

// change 
old_name = settings.DATABASE_NAME 
from django.db import connection 
connection.creation.create_test_db(verbosity, autoclobber=not interactive) 
result = unittest.TextTestRunner(verbosity=verbosity).run(suite) 
connection.creation.destroy_test_db(old_name, verbosity) 

// to: 
result = unittest.TextTestRunner(verbosity=verbosity).run(suite) 

Hãy chắc chắn để làm tất cả những hàng nhập khẩu cần thiết ở phía trên và sau đó trong cài đặt của bạn tập tin thiết lập các thiết lập:

TEST_RUNNER = 'myproject.test.test_runner.run_tests' 

Bây giờ khi bạn chạy. /manage.py kiểm tra Django sẽ chạy các bài kiểm tra đối với trạng thái hiện tại của cơ sở dữ liệu của bạn thay vì tạo một phiên bản mới dựa trên các định nghĩa mô hình hiện tại của bạn. phương pháp

Một điều bạn có thể làm là tạo một bản sao của cơ sở dữ liệu của bạn tại địa phương, và sau đó làm một kiểm tra trong run_test mới của bạn() như thế này:

if settings.DATABASE_NAME != 'my_test_db': 
    sys.exit("You cannot run tests using the %s database. Please switch DATABASE_NAME to my_test_db in settings.py" % settings.DATABASE_NAME) 

Bằng cách đó không có nguy cơ chạy thử nghiệm chống lại bạn cơ sở dữ liệu chính.

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