2015-01-14 11 views
15

Trong unittest, tôi có thể biến thiết lập trong một lớp và sau đó là phương pháp của lớp này có thể chọn bất cứ biến nó muốn sử dụng ...unittest Vs pytest

class test_class(unittest.TestCase): 
    def setUp(self):   
     self.varA = 1 
     self.varB = 2 
     self.varC = 3 
     self.modified_varA = 2 

    def test_1(self): 
     do_something_with_self.varA, self.varB 

    def test_2(self): 
     do_something_with_self_modified_varA, self.varC 

Vì vậy, trong unittest, đó là dễ dàng để đặt bó thử nghiệm với nhau có thể đi theo một lớp và sau đó sử dụng nhiều biến khác nhau (varA và varB) cho các phương thức khác nhau. Trong pytest, tôi đã tạo ra một vật cố trong conftest.py thay vì một lớp trong unittest, như thế này ...

@pytest.fixture(scope="module") 
def input1(): 
    varA = 1 
    varB = 2 
    return varA, varB 

@pytest.fixture(scope="module") 
def input2(): 
    varA = 2 
    varC = 3 
    return varA, varC 

tôi ăn Input1 này và Input2 chức năng của tôi trong một tập tin khác nhau (giả sử test_this.py) cho hai chức năng khác nhau. Dưới đây là các câu hỏi dựa trên thông tin ở trên ...

  1. Vì tôi không thể chỉ khai báo biến cục bộ trong conftest.py vì tôi không thể nhập tệp này một cách đơn giản. Có cách nào tốt hơn để khai báo các biến khác nhau ở đây có thể được sử dụng trong các hàm khác nhau trong test_this.py không? Tôi có năm cấu hình khác nhau trong thử nghiệm thực tế của tôi cho các biến này, xác định rằng nhiều đồ đạc khác nhau trong conftest.py và sử dụng chúng làm đối số hàm trong năm hàm khác nhau trong test_this.py âm thanh đau đớn, tôi thà quay trở lại cấu trúc lớp không phân biệt, xác định các biến của tôi và chọn và chọn những gì tôi muốn

  2. Tôi có nên khai báo biến toàn cầu trong test_this.py và sử dụng chúng trong các hàm theo cách tôi muốn không? Dường như một chút không phải là pythonic. Các biến này chỉ được sử dụng bởi các hàm trong tệp này.

  3. Giả sử tôi cũng có test_that.py và test_them.py. Nếu tôi có một số biến được chia sẻ giữa các tệp khác nhau này, tôi sẽ khai báo chúng như thế nào? chỉ cần tạo một tập tin variables.py calle trong thư mục mà tất cả các tệp thử nghiệm này và thực hiện nhập khẩu bất cứ khi nào tôi cần? Bằng cách này, tôi có thể giữ tất cả dữ liệu riêng biệt.

  4. Đây có phải là ấn tượng của tôi rằng thực tế không khuyến khích sử dụng một lớp học để tổ chức các chức năng của bạn? Mỗi ví dụ tôi đọc trực tuyến, tất cả dường như chỉ sử dụng nhiều chức năng với đồ đạc. Cấu hình của việc xác định lớp và phương thức và tổ chức các thử nghiệm trong pytest là gì?

  5. Tôi có một kịch bản thử nghiệm nơi tôi phải sử dụng kết quả của một hàm này sang hàm khác. Với pytest, tôi có một khẳng định rằng là ở phần cuối của một chức năng không phải là một trở lại vì vậy tôi sẽ không thể sử dụng chức năng này như một vật cố định. Làm cách nào để tôi thực hiện việc này? Tôi biết đây không phải là một thực hành tốt mà thử nghiệm của tôi dựa trên một thử nghiệm khác nhưng có một công việc xung quanh?

Cảm ơn trước cho câu trả lời của bạn.

Trả lời

10

1) Trước hết bạn có thể khai báo các đồ đạc đó không chỉ trong conftest.py, mà còn trong mọi mô-đun python bạn muốn. Và bạn có thể nhập mô-đun đó. Ngoài ra bạn có thể sử dụng đồ đạc trong cùng một cách như bạn sử dụng phương pháp thiết lập:

@pytest.fixture(scope='class') 
def input(request): 
    request.cls.varA = 1 
    request.cls.varB = 2 
    request.cls.varC = 3 
    request.cls.modified_varA = 2 

@pytest.usefixtures('input') 
class TestClass: 

def test_1(self): 
    do_something_with_self.varA, self.varB 

def test_2(self): 
    do_something_with_self_modified_varA, self.varC 

hoặc bạn có thể xác định các biến riêng biệt trong đồ đạc riêng biệt:

def fixture_a(): 
    return varA 

def fixture_b(): 
    return varB 

def fixture_c(): 
    return varC 

def fixture_mod_A(): 
    return modified_varA 

hoặc làm cho một vật cố mà trả về tất cả các biến (tại sao không?) hoặc thậm chí làm cho vật cố parametrized gián tiếp trả về biến bởi sự lựa chọn của bạn (cách khá khó hiểu):

@pytest.fixture() 
def parametrized_iput(request): 
    vars = {'varA': 1, 'varB': 2, 'varC': 3} 
    var_names = request.param 
    return (vars[var_name] for var_name in var_names) 

@pytest.mark.parametrize('parametrized_iput', [('varA', 'varC')], indirect=True) 
def test_1(parametrized_iput) 
    varA, varC = parametrized_iput 
    ... 

Hoặc thậm chí bạn có thể làm cho nhà máy cố định mà sẽ làm cho đồ đạc cho bạn một cách nhanh chóng. Âm thanh tò mò khi bạn chỉ có 5 bài kiểm tra và 5 cấu hình của các biến, nhưng khi bạn nhận được hàng trăm của cả hai, nó có thể hữu ích.

3) Của cource bạn có thể. Nhưng tôi khuyên bạn không nên nhập trực tiếp tệp này, nhưng hãy sử dụng tùy chọn dòng lệnh để trỏ tệp nào cần nhập. Trong trường hợp này, bạn có thể cohoose một tập tin khác với các biến mà không thay đổi mã của bạn.

4) Tôi sử dụng các lớp trong bài kiểm tra của mình vì tôi đã di chuyển từ nosetest. Tôi đã không đề cập đến bất kỳ vấn đề với việc sử dụng các lớp học trong pytest.

5) Trong trường hợp đó tôi đề nghị bạn làm như sau: nắm tay thực hiện chức năng với những hành động mong muốn:

def some_actions(a, b): 
    # some actions here 
    ... 
    return c 

sau đó sử dụng nó cả trong thử nghiệm và cố định:

def test(): 
    assert some_actions(1,2) == 10 

@pytest.fixture() 
def some_fixture(): 
    return some_actions(1,2) 
+0

Cảm ơn bó, giúp. – LuckyStarr

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