2010-05-05 27 views
6

Django (1.2 beta) sẽ đặt lại (các) cơ sở dữ liệu giữa mỗi lần chạy thử, nghĩa là mỗi lần chạy thử trên một DB trống. Tuy nhiên, (các) cơ sở dữ liệu không phải là đỏ bừng. Một trong những ảnh hưởng của việc xả cơ sở dữ liệu là các bộ đếm auto_increment được đặt lại.Django có thể xóa (các) cơ sở dữ liệu của nó giữa mỗi bài kiểm tra đơn vị không?

Xem xét một thử nghiệm mà kéo dữ liệu ra khỏi cơ sở dữ liệu bằng cách khóa chính:

class ChangeLogTest(django.test.TestCase): 
    def test_one(self): 
     do_something_which_creates_two_log_entries() 
     log = LogEntry.objects.get(id=1) 
     assert_log_entry_correct(log) 
     log = LogEntry.objects.get(id=2) 
     assert_log_entry_correct(log) 

này sẽ vượt qua bởi vì chỉ có hai mục log đã từng tạo ra. Tuy nhiên, nếu một thử nghiệm khác được thêm vào ChangeLogTest và nó sẽ xảy ra để chạy trướctest_one, các khóa chính của các mục nhập nhật ký không còn 1 và 2, chúng có thể là 2 và 3. Bây giờ test_one không thành công.

Đây thực sự là một câu hỏi hai phần:

  1. Có thể để buộc ./manage.py test để tuôn ra những cơ sở dữ liệu giữa mỗi trường hợp thử nghiệm?
  2. Vì Django không tuôn ra DB giữa mỗi bài kiểm tra theo mặc định, có thể có lý do chính đáng. Có ai biết không?

Trả lời

7

có thể bắt buộc ./manage.py kiểm tra để xóa cơ sở dữ liệu giữa mỗi trường hợp thử nghiệm?

Xem qua việc thực hiện lệnh django.core.management.commands.flush.py.

Bạn có thể gọi lệnh tuôn ra từ bên trong gọi thử nghiệm của bạn (có thể trong TestCase.setUp):

management.call_command('flush') 

có thể có một lý do chính đáng. Có ai biết không?

Có: Tăng tốc. Flushing và tải lại nhiều dữ liệu từ json mất một thời gian ...

Có lẽ bạn nên có một cái nhìn vào TransactionTestCase

8

Câu trả lời cho điều này, đừng viết bài kiểm tra của bạn trong một cách như họ phụ thuộc vào đặc biệt giá trị khóa. Ví dụ: thử nghiệm của bạn có thể được viết tốt hơn:

def test_one(self): 
    do_something_which_creates_two_log_entries() 
    logs = LogEntry.objects.all() 
    assert_log_entry_correct(log[0]) 
    assert_log_entry_correct(log[1]) 
+0

Tôi đoán điều đó sẽ hoạt động vì 'LogEntry.objects.all()' luôn trả về các bản ghi theo cùng một thứ tự (tăng khóa chính), phải không? –

+0

không xác định, nhưng có thể là có. Nếu bạn muốn chắc chắn, chỉ cần sắp xếp kết quả theo id –

+1

@Mike, Ivan: ..hoặc thêm 'ordering = ('id',)' vào Model.Meta –

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