2013-01-16 43 views
7

Tôi có một số unittests Python mà tôi đang khám phá và chạy bằng mũi. Tôi đã quan sát một số trình tự lạ của setUpModule(), tearDownModule() và nhập khẩu các mô-đun thử nghiệm. Tôi có điều này (ví dụ) cấu trúc thư mục:setUpModule, tearDownModule và nhập có thể không theo thứ tự dưới mũi

test1.py 
test_dir/test2.py 

Cả test1.py và test2.py trông như thế này:

import sys 
import unittest 

def flushwrite(text): 
    sys.stdout.write(text + '\n') 
    sys.stdout.flush() 

flushwrite("import %s" % __name__) 

def setUpModule(): 
    flushwrite("setUp %s" % __name__) 

def tearDownModule(): 
    flushwrite("tearDown %s" % __name__) 

class Test(unittest.TestCase): 
    def test1(self): 
     flushwrite("running %s.test1" % __name__) 

Khi tôi chạy nosetests -s test1.py test_dir/test2.py, tôi thấy trình tự này:

  1. nhập test1
  2. nhập test2
  3. setUp test1
  4. chạy test1.test1
  5. teardown test1
  6. setUp test2
  7. chạy test2.test1
  8. teardown test2

Đó là những gì tôi mong đợi/khao khát. Khi tôi chạy nosetests -s test1.py test_dir (sử dụng khám phá thử nghiệm để tìm test2.py), tôi thấy trình tự này:

  1. test1 nhập khẩu
  2. test2 nhập khẩu
  3. setUp test1
  4. chạy test1.test1
  5. test2 setUp
  6. chạy test2.test1
  7. teardown test2
  8. tearDown test1

Lưu ý rằng tearDown cho test1 thực thi SAU các thử nghiệm của test2. Điều này có nghĩa là hệ thống không ở trạng thái sạch khi test2 chạy! Rõ ràng, điều này có thể là một vấn đề trong môi trường sản xuất của hàng ngàn thử nghiệm được phát hiện từ một cây thư mục lớn.

Có chuyện gì? Tôi có hiểu nhầm điều gì đó không? Có cách nào để đảm bảo rằng tearDownModule được chạy sau mỗi mô-đun thử nghiệm?

+0

Tôi có thể sử dụng ['--with-isolation'] của nosetests (https://nose.readthedocs.org/en/latest/plugins/isolate.html). Tuy nhiên, dường như nó có vấn đề riêng. – dbn

+0

Bây giờ, tôi đã chuyển sang sử dụng tearDownSuite() thay vì tearDownModule(). – dbn

Trả lời

1

Kể từ tập tin test2.py của bạn đang được các module giống như test1.py, các setUpModuletearDownModule phương pháp từ test1.py cả áp dụng cho test2.py.

Tôi chỉ sử dụng setUpClasstearDownClass và đặt chúng bên trong lớp Kiểm tra của bạn. Bằng cách này bạn sẽ đảm bảo rằng các thiết lập và tearDown được gắn liền với từng lớp riêng biệt.