2013-11-01 12 views
8

Tôi đang sử dụng chú thích tham số của pytest để chuyển các tham số vào một lớp. Tôi có thể sử dụng các tham số trong các phương pháp thử nghiệm, tuy nhiên, tôi không thể tìm ra cách sử dụng các tham số trong phương thức setup_class.pytest: Cách chuyển tham số lớp tới setup_class

import pytest 

params = ['A','B','C'] 

@pytest.mark.parametrize('n', params) 
class TestFoo: 

    def setup_class(cls): 
     print ("setup class:TestFoo") 
     # Do some setup based on param 

    def test_something(self, n): 
     assert n != 'D' 

    def test_something_else(self, n): 
     assert n != 'D' 

tôi đã cố gắng thêm 'n' như một tham số như các phương pháp kiểm tra, như thế này:

def setup_class(cls, n): 
     print ("setup class:TestFoo") 
     # Do some setup based on param 

mà kết quả trong một lỗi:

self = <Class 'TestFoo'> 

    def setup(self): 
     setup_class = xunitsetup(self.obj, 'setup_class') 
     if setup_class is not None: 
      setup_class = getattr(setup_class, 'im_func', setup_class) 
      setup_class = getattr(setup_class, '__func__', setup_class) 
>   setup_class(self.obj) 
E   TypeError: setup_class() takes exactly 2 arguments (1 given) 

Có một số cách khác sử dụng tham số trong phương thức setup_class?

Trả lời

-3

Bạn nên chuyển thuộc tính cho lớp thử nghiệm của mình bằng cách gán thuộc tính cho cls. Tất cả các thuộc tính và hàm mà bạn gán cho nó sau này sẽ trở thành attrubutes/phương thức của lớp.

trang trí parametrized nên được sử dụng trên các phương thức lớp (bạn muốn kiểm tra phương pháp, không bạn?)

Vì vậy:

import pytest 

params = ['A','B','C'] 

class TestFoo: 

    def setup_class(cls): 
     cls.n = params 

    @pytest.mark.parametrize('n', params) 
    def test_something(self, n): 
     assert n != 'D' 

    @pytest.mark.parametrize('n', params) 
    def test_something_else(self, n): 
     assert n != 'D' 

    def test_internal(self): 
     assert self.n != params 

thử nghiệm sẽ thất bại trên test_internal. It illustrates that params were set to self.n and now tự .n equals to params`

+2

này không thực sự giải quyết những gì tôi đang cố gắng làm. Trong mỗi bài kiểm tra, 'n' là một mục từ danh sách params. Trong ví dụ của bạn, bạn đang gán toàn bộ danh sách cho cls.n. Bằng cách thực hiện nó ở cấp lớp, những gì tôi muốn là, đối với mục 'A', hãy chạy thiết lập cụ thể cho mục 'A', sau đó chạy thử nghiệm cho mục 'A'. – user2945303

+0

Ngoài ra, đây là gì? Ví dụ, nó thậm chí không sử dụng trang trí cho phương pháp thiết lập trong lớp, không có giọt nước mắt tương ứng, và như vậy. – lpapp

1

Bạn không thể.

Đầu tiên, setup_class chỉ được gọi một lần cho mỗi lớp, ngay cả khi có parametrize lịch thi đấu được sử dụng - lớp học chỉ được thiết lập một lần.

Thứ hai, nó không được thiết kế để thực hiện bất kỳ thông số nào khác ngoài cls. Nó sẽ không chấp nhận các thông số từ paramterize và các đồ đạc khác.

Là một giải pháp, bạn có thể sử dụng một vật cố parametrized với phạm vi "class":

import pytest 

params = ['A', 'B', 'C'] 


@pytest.fixture(
    scope="class", 
    params=params, 
) 
def n(request): 
    print('setup once per each param', request.param) 
    return request.param 


class TestFoo: 

    def test_something(self, n): 
     assert n != 'D' 

    def test_something_else(self, n): 
     assert n != 'D' 

Để biết thêm thông nhìn vào http://docs.pytest.org/en/latest/fixture.html#fixture-parametrize

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