2017-03-07 20 views
12

Tôi đang sử dụng một số joblib.Memory để lưu các tính toán đắt tiền khi chạy thử nghiệm với py.test. Mã tôi đang sử dụng sẽ giảm xuống như sau,Xóa các tệp được lưu trong bộ nhớ cache sau khi chạy py.test

from joblib import Memory 

memory = Memory(cachedir='/tmp/') 

@memory.cache 
def expensive_function(x): 
    return x**2 # some computationally expensive operation here 

def test_other_function(): 
    input_ds = expensive_function(x=10) 
    ## run some tests with input_ds 

hoạt động tốt. Tôi biết điều này có thể được thực hiện một cách thanh lịch hơn với lịch thi đấu tmpdir_factory nhưng điều đó không đúng.

Vấn đề tôi đang gặp là làm thế nào để làm sạch các tập tin lưu trữ một lần tất cả các bài kiểm tra chạy,

  • là nó có thể chia sẻ một biến toàn cầu trong số tất cả các bài kiểm tra (trong đó sẽ chứa ví dụ như một danh sách các đường dẫn đến các đối tượng được lưu trong bộ nhớ cache)?
  • là có một cơ chế trong py.test để gọi một số lệnh sau khi tất cả các thử nghiệm được chạy (cho dù họ thành công hay không)?

Trả lời

8

có thể chia sẻ biến toàn cục trong tất cả các thử nghiệm (có chứa danh sách đường dẫn đến đối tượng được lưu trong bộ nhớ cache) không?

Tôi sẽ không đi theo con đường đó. Trạng thái có thể thay đổi toàn cầu là điều tốt nhất nên tránh, đặc biệt là trong thử nghiệm.

có một cơ chế trong py.test để gọi một số lệnh khi tất cả các thử nghiệm được chạy (cho dù chúng thành công hay không)?

Vâng, thêm một trận đấu phiên scoped tự động sử dụng vào dự án cấp của bạn conftest.py file:

# conftest.py 
import pytest 

@pytest.yield_fixture(autouse=True, scope='session') 
def test_suite_cleanup_thing(): 
    # setup 
    yield 
    # teardown - put your command here 

Các mã sau khi sản lượng sẽ được chạy - một lần - vào cuối của bộ ứng dụng thử nghiệm , bất kể vượt qua hay thất bại.

+1

Cảm ơn, đó là những gì tôi đang tìm kiếm. Đồng ý với bạn về các biến toàn cục trong thử nghiệm .. – rth

2

có thể chia sẻ biến toàn cục trong tất cả các thử nghiệm ( có chứa danh sách đường dẫn đến các đối tượng được lưu trong bộ nhớ cache) không?

Thực tế có một vài cách để thực hiện điều đó, mỗi cách có ưu và nhược điểm. Tôi nghĩ rằng SO câu trả lời này tóm chúng lên khá đẹp - https://stackoverflow.com/a/22793013/3023841 - nhưng ví dụ:

def pytest_namespace(): 
    return {'my_global_variable': 0} 

def test_namespace(self): 
    assert pytest.my_global_variable == 0 

là có một cơ chế trong py.test để gọi một số lệnh một lần tất cả các bài kiểm tra được điều hành (cho dù họ thành công hay không)?

Vâng, py.test có teardown chức năng có sẵn:

def setup_module(module): 
    """ setup any state specific to the execution of the given module.""" 

def teardown_module(module): 
    """ teardown any state that was previously setup with a setup_module 
    method. 
    """ 
+0

Cảm ơn bạn đã trả lời. Tôi nghĩ rằng tôi sẽ đi với các giải pháp khác, nhưng điều này chắc chắn là thông tin hữu ích. Tôi không biết về các chức năng teardown mức module. – rth

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