2013-07-23 41 views
13

Tôi đang viết các bài kiểm tra selen, với một tập hợp các lớp, mỗi lớp có chứa một số bài kiểm tra. Mỗi lớp hiện sẽ mở ra và sau đó đóng trình duyệt Firefox, trong đó có hai hậu quả:Làm cách nào để chạy một phương thức trước tất cả các bài kiểm tra trong tất cả các lớp?

  • siêu chậm, mở firefox mất nhiều thời gian hơn so với chạy thử nghiệm trong một lớp học ...
  • tai nạn, bởi vì sau khi firefox đã bị đóng cửa, cố gắng để mở lại nó thật nhanh chóng, từ selen, dẫn đến 'Lỗi 54'

Tôi có thể giải quyết lỗi 54, có thể, bằng cách thêm một giấc ngủ, nhưng nó vẫn sẽ siêu chậm.

Vì vậy, những gì tôi muốn làm là sử dụng lại cùng một phiên bản Firefox trên tất cả các lớp kiểm tra. Điều này có nghĩa là tôi cần chạy một phương thức trước tất cả các lớp thử nghiệm và một phương thức khác sau tất cả các lớp thử nghiệm. Vì vậy, 'setup_class' và 'teardown_class' là không đủ.

+0

Thiết lập [ 'scope'] (http://pytest.org/latest/fixture.html#working-with-a-module-shared-fixture) thành 'module' chưa đủ? – Bakuriu

+0

Tôi cần một chức năng để chạy một lần, ngay tại phần cuối, để tắt trình duyệt web. Tôi không muốn tắt trình duyệt web sau mỗi lớp/mô-đun. Tôi cũng không muốn nó không bao giờ bị đóng cửa. –

+0

Sau đó, nó là khá dễ dàng: sử dụng ['atexit'] (http://docs.python.org/2/library/atexit.html) và đăng ký chức năng sẽ đóng firefox được thực hiện ngay trước khi thông dịch viên thoát. – Bakuriu

Trả lời

24

Bạn có thể muốn sử dụng một phiên scoped "autouse" cố định:

# content of conftest.py or a tests file (e.g. in your tests or root directory) 

@pytest.fixture(scope="session", autouse=True) 
def do_something(request): 
    # prepare something ahead of all tests 
    request.addfinalizer(finalizer_function) 

này sẽ chạy về phía trước của tất cả các bài kiểm tra. Trình hoàn thiện sẽ được gọi sau khi thử nghiệm cuối cùng kết thúc.

14

Sử dụng lịch thi đấu theo đề xuất của hpk42 sẽ hoạt động trong nhiều trường hợp, nhưng lịch thi đấu sẽ chỉ chạy sau khi tất cả các bài kiểm tra được thu thập. Nếu bạn muốn chạy mã trước khi bộ sưu tập các bài kiểm tra, bạn có việc sử dụng giấy tờ kém pytest_configure hoặc pytest_sessionstart:

# content of conftest.py 

def pytest_sessionstart(session): 
    """ before session.main() is called. """ 
    pass 

def pytest_sessionfinish(session, exitstatus): 
    """ whole test run finishes. """ 
    pass 
5

Bắt đầu từ phiên bản 2.10 có một cách sạch để hạ bệ các vật cố cũng như việc xác định phạm vi của nó. Vì vậy, bạn có thể sử dụng cú pháp sau:

@pytest.fixture(scope="module", autouse=True) 
def my_fixture(): 
    print ('INITIALIZATION') 
    yield param 
    print ('TEAR DOWN') 

Tham số autouse: Từ documentation:

Sau đây là cách autouse đồ đạc làm việc trong phạm vi khác:

  • đồ đạc autouse vâng lời phạm vi = đối số từ khóa: nếu lịch thi đấu của người phối ngẫu có phạm vi = 'phiên', nó sẽ chỉ được chạy một lần, bất kể ở đâu nó tôi s được định nghĩa. scope = 'class' có nghĩa là nó sẽ được chạy một lần cho mỗi lớp học, v.v.

  • nếu một vật cố định được xác định trong một mô-đun thử, tất cả các chức năng kiểm tra của nó sẽ tự động sử dụng nó.

  • nếu cố định autouse được định nghĩa trong tệp conftest.py thì tất cả các thử nghiệm trong tất cả các mô-đun thử nghiệm bên dưới thư mục của nó sẽ gọi ra lịch thi đấu.

    ...

"yêu cầu" tham số: Lưu ý rằng "yêu cầu" tham số là không cần thiết cho mục đích của bạn mặc dù bạn có thể muốn sử dụng nó cho mục đích khác.Từ documentation:

"Fixture chức năng có thể chấp nhận các đối tượng yêu cầu nội quan các ‘yêu cầu’chức năng kiểm tra, lớp học hoặc mô-đun bối cảnh .."

+0

Đây là cập nhật nhất và phải được upvoted. – gbonetti

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