2012-02-24 59 views
6

Tôi làm việc trên một bộ kiểm tra đơn vị python hiện đang được xây dựng bằng cách sử dụng pythons được xây dựng trong khung kiểm tra. Tôi muốn viết các bài kiểm tra tối ưu hóa sẽ thực thi nhiều lần dựa trên tập hợp dữ liệu tôi cung cấp.Tham số các bài kiểm tra đơn vị trong python

tức là. nếu tập dữ liệu của tôi là [1,2,3,4] chức năng thử nghiệm của tôi sẽ chạy bốn lần bằng cách sử dụng đầu vào trong tập dữ liệu của tôi.

def test(data): 
    if data > 0: 
     #Pass the test 

Từ hiểu biết của tôi, điều này không thể thực hiện trong khung được xây dựng, trừ khi tôi đặt vòng lặp vào hàm thử nghiệm của mình. Tôi không muốn làm điều này bởi vì tôi cần thử nghiệm để tiếp tục thực hiện ngay cả khi một đầu vào không thành công.

Tôi đã thấy rằng có thể thực hiện bằng cách sử dụng mũi hoặc pyTest. Đó là khuôn khổ tốt nhất để sử dụng? Có một khuôn khổ nào khác mà tôi có thể sử dụng sẽ tốt hơn một trong những khung này?

Cảm ơn trước!

Trả lời

6

Lưu ý rằng đây chính là một trong những ứng dụng phổ biến nhất của việc bổ sung gần đây của funcargs trong py.test.

Trong trường hợp của bạn, bạn sẽ nhận được:

def pytest_generate_tests(metafunc): 
    if 'data' in metafunc.funcargnames: 
     metafunc.parametrize('data', [1,2,3,4]) 

def test_data(data): 
    assert data > 0 

[EDIT] Tôi có lẽ nên thêm rằng bạn cũng có thể làm điều đó một cách đơn giản như

@pytest.mark.parametrize('data', [1,2,3,4]) 
def test_data(data): 
    assert data > 0 

Vì vậy, tôi muốn nói rằng py .test là một khuôn khổ tuyệt vời cho thử nghiệm đơn vị tham số ...

1

Bạn có thể tạo các bài kiểm tra tự động dựa trên dữ liệu của bạn thiết lập theo cách sau:

import unittest 

data_set = [1,2,3,4] 

class TestFunctions(unittest.TestCase): 
    pass # all your non-dynamic tests here as normal 

for i in data_set: 
    test_name = "test_number_%s" % i # a valid unittest test name starting with "test_" 
    def dynamic_test(self, i=i): 
     self.assertTrue(i % 2) 
    setattr(TestFunctions, test_name, dynamic_test) 

if __name__ == '__main__': 
    unittest.main() 

Câu hỏi Python unittest: Generate multiple tests programmatically? có thảo luận thêm về điều này, trong đó có another approach mà đạt được điều tương tự bằng cách tạo động nhiều trường hợp của các bài kiểm tra trường hợp vào một bộ thử nghiệm.

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