2012-04-27 42 views
8

Tôi đã viết một gói (http://github.com/anntzer/parsedcmd) chạy với cả Python2 và Python3. Tuy nhiên, tôi đã phải viết các bài kiểm tra đơn vị riêng biệt (py.test) cho Python2 và Python3 (chủ yếu là vì tôi muốn thử nghiệm các tính năng bổ sung của Python3, trong các đối số chỉ từ khoá cụ thể), vì vậy tôi có test_py2.pytest_py3.py trong gói phụ test . Bây giờ, nếu tôi chạy, hãy đọc số py.test2 mypkg, test_py2, nhưng test_py3 không thành công với số SyntaxError. Tương tự như vậy, đối với py.test3 mypkg, test_py3 vượt qua nhưng test_py2 không thành công (tôi có thể thực hiện việc này mặc dù đây chỉ là vấn đề của StringIO khi được chuyển đến io).py.test chạy Python2 và Python3

tôi có thể thiết kế các gói con test để import mypkg.test chỉ nhập khẩu đúng phiên bản của các bài kiểm tra, nhưng dường như py.test không quan tâm - nó chỉ thấy hai tập tin phù hợp với test_* và lấy tất cả các bài kiểm tra ở cả trong số họ, bỏ qua những gì __init__.py yêu cầu anh ta nhập.

Vì vậy, ngay bây giờ, tôi phải thực hiện cả hai py.test2 mypkg/test/test_py2.pypy.test3 mypkg/test/test_py3.py. Có cách nào để thiết lập toàn bộ điều đó để py.test2 mypkgpy.test3 mypkg sẽ "hoạt động" không?

Cảm ơn.

Trả lời

5

Nếu sau đó bạn có thể làm cho mô-đun của mình có thể nhập được trên tất cả các thông dịch viên và bỏ qua các bài kiểm tra khi thích hợp là một giải pháp phổ biến. Nếu không, bạn có thể đặt những điều sau đây là "conftest.py" vào thư mục kiểm tra:

import sys 
py3 = sys.version_info[0] >= 3 

class DummyCollector(pytest.collect.File): 
    def collect(self): 
     return [] 

def pytest_pycollect_makemodule(path, parent): 
    bn = path.basename 
    if "py3" in bn and not py3 or ("py2" in bn and py3): 
    return DummyCollector(path, parent=parent) 

này được nhặt một plugin dự án cụ thể và đúng cách sẽ bỏ qua một module kiểm tra với một tên tập tin chứa một "py2" hoặc " py3 "chuỗi con trên phiên bản thông dịch sai. Tất nhiên bạn có thể tinh chỉnh nó để có một danh sách rõ ràng trực tiếp trong tập tin conftest.py thay vì kiểm tra tên tập tin vvpp.

HTH, holger

0

Đặt thử nghiệm của bạn trong các gói khác nhau và chỉ chạy thử nghiệm trong gói thích hợp. Hoặc tải các mô-đun thử nghiệm thích hợp trong một kịch bản:

import sys, unittest 

cur_version = sys.version_info() 

if cur_version[0] < 3 
    import myApp.test.test_py2 
    unittest.TestLoader().loadTestsFromModule(myApp.test.test_py2).run() 
else: 
    import myApp.test.test_py3 
    unittest.TestLoader().loadTestsFromModule(myApp.test.test_py3).run() 

hoặc sử dụng một tập tin setup.py vì vậy bạn có thể chạy

python setup.py test

và đặt logic phiên bản trong đó:

versionedTestSuite = "parsedcmd.test.test_py2" # do something as above here 
setup(name='parsedcmd', 
     ... 
     test_suite=versionedTestSuite, 
    ) 
Các vấn đề liên quan