2008-12-14 48 views
14

Hiện nay mã của tôi được tổ chức trong cơ cấu cây sau:Làm thế nào để tổ chức thử nghiệm python theo cách mà tôi có thể chạy tất cả các thử nghiệm trong một lệnh duy nhất?

src/ 
    module1.py 
    module2.py 
    test_module1.py 
    test_module2.py 
    subpackage1/ 
     __init__.py 
     moduleA.py 
     moduleB.py 
     test_moduleA.py 
     test_moduleB.py 

Trường hợp module*.py file chứa mã nguồn và test_module*.py chứa TestCase s cho các mô-đun có liên quan.

Với comands sau tôi có thể chạy các bài kiểm tra chứa trong một tập tin duy nhất, ví dụ:

$ cd src 
$ nosetests test_filesystem.py 
.................. 
---------------------------------------------------------------------- 
Ran 18 tests in 0.390s 

OK 

Làm thế nào tôi có thể chạy tất cả các bài kiểm tra? Tôi đã thử với nosetests -m 'test_.*' nhưng nó không hoạt động.

$cd src 
$ nosetests -m 'test_.*' 

---------------------------------------------------------------------- 
Ran 0 tests in 0.000s 

OK 

Cảm ơn

Trả lời

7

Nếu tất cả đều bắt đầu với test sau đó chỉ cần nosetest nên công việc. Mũi tự động tìm kiếm bất kỳ tệp nào bắt đầu bằng 'kiểm tra'.

+2

Tôi đã tìm thấy sự cố, các nosetests bỏ qua chúng vì các tệp thi hành. Tôi đã cố định đặt lại bit quyền thực thi và xóa thuộc tính svn: executable khỏi thuộc tính subversion. –

+2

Tùy chọn [--exe] (http://packages.python.org/nose/usage.html#cmdoption--exe) sẽ ngăn không cho các nosetests bỏ qua các tệp thi hành được. –

+0

Có lẽ đáng xem xét việc chuyển sang 'nose2' thay vì' nosetest'. https://nose2.readthedocs.io/en/latest/getting_started.html – pds

2

Đây có lẽ là một chủ đề nóng bỏng-tranh cãi, nhưng tôi sẽ đề nghị bạn nên tách các xét nghiệm của bạn ra khỏi module của bạn. Thiết lập một cái gì đó như thế này ...

Sử dụng setup.py để cài đặt chúng vào đường dẫn hệ thống (hoặc bạn có thể sửa đổi biến môi trường để tránh sự cần thiết cho bước "cài đặt").

foo/ 
    module1.py 
    module2.py 
    subpackage1/ 
     __init__.py 
     moduleA.py 
     moduleB.py 

Bây giờ bất kỳ tập lệnh python nào cũng có thể truy cập các mô-đun đó, thay vì tùy thuộc vào việc tìm chúng trong thư mục cục bộ. Đặt xét nghiệm của bạn tất cả ra để các bên như thế này:

tests/ 
    test_module1.py 
    test_module2.py 
    test_subpackage1_moduleA,py 
    test_subpackage2_moduleB.py 

Tôi không chắc chắn về lệnh nosetests của bạn, nhưng bây giờ mà các bài kiểm tra của bạn là tất cả trong cùng một thư mục, nó trở nên dễ dàng hơn nhiều để viết một kịch bản wrapper mà chỉ cần nhập tất cả các thử nghiệm khác trong cùng một thư mục. Hoặc nếu đó là không thể, ít nhất bạn có thể nhận được ngay với một bash vòng lặp đơn giản mà được file thử nghiệm của bạn từng người một:

#!/bin/bash 
cd tests/ 
for TEST_SCRIPT in test_*.py ; do 
    nosetests -m $TEST_SCRIPT 
done 
+4

Tôi khuyên bạn nên phản ánh cấu trúc gói của chương trình trong thư mục kiểm tra. Nếu không thư mục kiểm tra sẽ trở thành một mớ hỗn độn khi chương trình phát triển. – deamon

0

tôi sẽ cung cấp một câu trả lời Testoob.

Chạy thử nghiệm trong một tập tin duy nhất là như Mũi:

testoob test_foo.py 

Để chạy thử nghiệm trong nhiều tác phẩm bạn có thể tạo dãy phòng với các nhà sưu tập Testoob (trong mỗi gói con)

# src/subpackage?/__init__.py 
def suite(): 
    import testoob 
    return testoob.collecting.collect_from_files("test_*.py") 

# src/alltests.py 
test_modules = [ 
    'subpackage1.suite', 
    'subpackage2.suite', 
] 

def suite(): 
    import unittest 
    return unittest.TestLoader().loadTestsFromNames(test_modules) 

if __name__ == "__main__": 
    import testoob 
    testoob.main(defaultTest="suite") 

Tôi chưa thử kịch bản cụ thể của bạn.

11

Cho dù bạn tách riêng hoặc trộn thử nghiệm và mô-đun có thể là vấn đề của hương vị, mặc dù tôi sẽ mạnh mẽ ủng hộ để giữ chúng ngoài (lý do thiết lập, thống kê mã vv).

Khi bạn đang sử dụng nosetests, hãy chắc chắn rằng tất cả các thư mục với các bài kiểm tra là gói thực:

src/ 
    module1.py 
    module2.py 
    subpackage1/ 
     __init__.py 
     moduleA.py 
     moduleB.py 
tests/ 
    __init__.py 
    test_module1.py 
    test_module2.py 
    subpackage1/ 
     __init__.py 
     test_moduleA.py 
     test_moduleB.py 

Bằng cách này, bạn chỉ có thể chạy nosetests vào thư mục cấp và tất cả các bài kiểm tra sẽ được tìm thấy.Bạn cần đảm bảo rằng src/ nằm trên PYTHONPATH, tuy nhiên, nếu không tất cả các kiểm tra sẽ không thành công do thiếu nhập.

4

Tôi không biết về nosetests, nhưng bạn có thể đạt được điều đó với mô-đun unittest tiêu chuẩn. Bạn chỉ cần tạo một tệp test_all.py trong thư mục gốc của bạn, sau đó nhập tất cả các mô-đun thử nghiệm của bạn. Trong trường hợp của bạn:

import unittest 
import test_module1 
import test_module2 
import subpackage1 
if __name__ == "__main__": 
    allsuites = unittest.TestSuite([test_module1.suite(), \ 
           test_module2.suite(), \ 
           subpackage1.test_moduleA.suite(), \ 
           subpackage1.test_moduleB.suite()]) 

mỗi module nên cung cấp các chức năng sau đây (ví dụ với một mô-đun với hai bài kiểm tra đơn vị: Class1Class2):

def suite(): 
    """ This defines all the tests of a module""" 
    suite = unittest.TestSuite() 
    suite.addTest(unittest.makeSuite(Class1)) 
    suite.addTest(unittest.makeSuite(Class2)) 
    return suite 
if __name__ == '__main__': 
    unittest.TextTestRunner(verbosity=2).run(suite()) 
+0

Đây là những gì tôi đang tìm kiếm, ngoại trừ việc tôi nghĩ bạn nên bỏ qua '()' sau mỗi tên bộ (ít nhất là dưới Python 2.6.5). –

+0

Python 2.7 có một cách để tự động tìm các mô-đun/gói thử nghiệm, có vẻ dễ bảo trì hơn là nhớ thêm chúng một cách rõ ràng vào một test_all.py. Xem http://docs.python.org/library/unittest.html#test-discovery –