2013-07-18 29 views
16

Tôi đang sử dụng py.test và tự hỏi nếu/làm thế nào nó có thể lấy tên của thử nghiệm hiện đang thực hiện trong phương pháp setup được gọi trước khi chạy mỗi thử nghiệm. Hãy xem xét mã này:py.test: cách lấy tên của bài kiểm tra hiện tại từ phương pháp thiết lập?

class TestSomething(object): 

    def setup(self): 
     test_name = ... 

    def teardown(self): 
     pass 

    def test_the_power(self): 
     assert "foo" != "bar" 

    def test_something_else(self): 
     assert True 

Ngay trước TestSomething.test_the_power trở nên thực hiện, tôi muốn được tiếp cận với tên này trong setup như được nêu trong mã qua test_name = ... để test_name == "TestSomething.test_the_power".

Thực ra, trong setup, tôi phân bổ một số tài nguyên cho mỗi bài kiểm tra. Cuối cùng, nhìn vào các tài nguyên đã được tạo ra bởi các bài kiểm tra đơn vị khác nhau, tôi muốn để có thể xem cái nào đã được tạo ra bởi thử nghiệm nào. Điều tốt nhất là chỉ sử dụng tên thử nghiệm khi tạo tài nguyên.

Trả lời

8

Các setupteardown phương pháp dường như là phương pháp di sản để hỗ trợ kiểm tra bằng văn bản cho các khuôn khổ khác, ví dụ mũi. Phương thức gốc pytest được gọi là setup_method cũng như teardown_method nhận phương thức kiểm tra hiện được thực hiện làm đối số. Do đó, những gì tôi muốn đạt được, có thể được viết như sau:

class TestSomething(object): 

    def setup_method(self, method): 
     print "\n%s:%s" % (type(self).__name__, method.__name__) 

    def teardown_method(self, method): 
     pass 

    def test_the_power(self): 
     assert "foo" != "bar" 

    def test_something_else(self): 
     assert True 

Kết quả của py.test -s sau đó là:

============================= test session starts ============================== 
platform linux2 -- Python 2.7.3 -- pytest-2.3.3 
plugins: cov 
collected 2 items 

test_pytest.py 
TestSomething:test_the_power 
. 
TestSomething:test_something_else 
. 

=========================== 2 passed in 0.03 seconds =========================== 
0

Hãy thử type(self).__name__ có lẽ?

+0

Trong ví dụ của tôi, điều này sẽ chỉ cung cấp 'TestSomething'. Tôi chủ yếu là sau phần thứ hai của tên :) –

0

Bạn có thể có nhiều bài kiểm tra, trong trường hợp này ...

test_names = [n for n in dir(self) if n.startswith('test_')] 

... sẽ cung cấp cho bạn tất cả các chức năng và các biến Ví dụ bắt đầu với "test_" trong self. Miễn là bạn không có bất kỳ biến nào có tên "test_something" thì điều này sẽ hoạt động.

Bạn cũng có thể xác định phương thức setup_method(self, method) thay vì setup(self) và điều đó sẽ được gọi trước mỗi lần gọi phương thức thử nghiệm. Sử dụng điều này, bạn chỉ cần đưa ra từng phương thức như một tham số. Xem: http://pytest.org/latest/xunit_setup.html

+0

Tất cả các phương thức biểu diễn các bài kiểm tra py.test bắt đầu bằng 'test'. Những gì tôi cần ở đây là py.test API, vì py.test đã thu thập tất cả các bài kiểm tra trước (về cơ bản là cách bạn đề xuất ở đây) và đã biết thử nghiệm nào sẽ được chạy ngay bây giờ. Tôi chỉ không biết câu hỏi đúng để hỏi py.test :-) –

+0

Bình luận sau khi chỉnh sửa của bạn: Tôi không muốn chỉ đơn giản là có một danh sách tất cả các phương pháp bắt đầu với "test_". Từ danh sách này, tôi sau tên/phương pháp thử nghiệm đang được thực hiện * ngay bây giờ *. Và điều này chỉ có các py.test internals có thể nói. –

+0

Tôi nghĩ rằng bạn muốn 'setup_method' thay vì chỉ' setup' – ejk314

0

Bạn có thể thử mô-đun kiểm tra.

nhập khẩu kiểm tra

def foo(): 
    print "My name is: ", inspect.stack()[0][3] 


foo() 

Output: Tên tôi là: foo

+0

Được gọi từ bên trong phương thức 'setup', điều này rõ ràng trả về' setup'. –

+0

Điều này rất hữu ích đối với tôi, cảm ơn! – kroe761

35

Bạn cũng có thể làm điều này bằng cách sử dụng Request Fixture như thế này:

def test_name1(request): 
    testname = request.node.name 
    assert testname == 'test_name1' 
+6

** Đây là câu trả lời có mục đích chung, ** áp dụng chung cho cả hai phương thức thử nghiệm _and_. Trong khi tài liệu py.test là _usually_ ngoạn mục, tài liệu của nó cho 'request' fixture là bất thường khủng khiếp. Thuộc tính 'request.node' chỉ được ghi thành" nút thu thập cơ bản (phụ thuộc vào phạm vi yêu cầu hiện tại). " Đó là nó. Tôi hoàn toàn _never_ đã có thể tìm thấy điều này - và nghi ngờ bất cứ ai khác sẽ có một trong hai. Bravo, điên cuồng Daniel! Tuy nhiên, –

+5

Lưu ý rằng khi chức năng thử nghiệm đã được parametrized, 'request.node.name' chứa tên duy nhất với các tham số, ví dụ: 'test_name [param-other_param]'. Do đó, _safer_ luôn sử dụng ['request.node.originalname'] (http://doc.pytest.org/en/latest/writing_plugins.html#_pytest.python.Function.originalname), cung cấp tên hàm ban đầu nguyên vẹn. Cũng lưu ý điều này có sẵn bắt đầu từ py.test 3.0. – julen

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