2015-02-03 19 views
8

Tôi sử dụng coveralls kết hợp với coverage.py để theo dõi phạm vi mã python của các tập lệnh thử nghiệm của tôi. Tôi sử dụng các lệnh sau:Bảo hiểm mã Python và đa xử lý

coverage run --parallel-mode --source=mysource --omit=*/stuff/idont/need.py ./mysource/tests/run_all_tests.py 
coverage combine 
coveralls --verbose 

Điều này hoạt động khá độc đáo với ngoại lệ multiprocessing. Mã được thực hiện bởi các nhóm công nhân hoặc các tiến trình con không được theo dõi.

Có khả năng theo dõi mã đa xử lý không? Bất kỳ tùy chọn cụ thể nào tôi bị thiếu? Có thể thêm trình bao bọc vào thư viện đa xử lý để bắt đầu bảo hiểm mỗi khi một tiến trình mới được sinh ra?

EDIT:

tôi (và jonrsharpe, cũng :-) tìm thấy một monkey-patch for multiprocessing.

Tuy nhiên, điều này không hiệu quả đối với tôi, việc xây dựng Tracis-CI của tôi bị giết gần như ngay sau khi bắt đầu. Tôi đã kiểm tra vấn đề trên máy cục bộ của mình và dường như thêm bản vá vào bộ nhớ đa xử lý cho bộ nhớ của tôi. Các thử nghiệm mất ít hơn 1GB bộ nhớ cần nhiều hơn 16GB với bản sửa lỗi này.

EDIT2:

Con khỉ-vá làm việc sau khi một sự thay đổi nhỏ: Xóa các config_file phân tích cú pháp (config_file=os.environ['COVERAGE_PROCESS_START']) đã làm các trick. Điều này giải quyết vấn đề của bộ nhớ cồng kềnh. Theo đó, dòng tương ứng đơn giản trở thành:

cov = coverage(data_suffix=True) 
+0

Bạn không kiểm tra mã cho các quy trình con đó trực tiếp phải không? – jonrsharpe

+0

Vâng, vâng, hầu hết là tôi làm. Nhưng có một số phần chỉ hữu ích và chỉ được thực hiện trong trường hợp đa xử lý được sử dụng (như gói cơ sở dữ liệu truy cập với khóa hoặc hàng đợi đa xử lý để thực thi lưu trữ dữ liệu nối tiếp). Và tôi biết rằng mã này đang hoạt động do các thử nghiệm thành công. Nó sẽ chỉ là tốt đẹp nếu điều này cũng sẽ hiển thị trên yếm :-) – SmCaterpillar

+1

Xem https://bitbucket.org/ned/coveragepy/issue/117/enable-coverage-measurement-of-code-run-by, qua http : //nedbatchelder.com/code/coverage/trouble.html – jonrsharpe

Trả lời

6

Bảo hiểm 4.0 bao gồm tùy chọn dòng lệnh --concurrency=multiprocessing để giải quyết vấn đề này. Bạn phải sử dụng coverage combine sau đó.

+2

Cảm ơn bạn đã chỉ ra yêu cầu sử dụng 'kết hợp vùng phủ sóng' sau đó. Tôi đã quay bánh xe của tôi trong một thời gian cố gắng tìm ra lý do tại sao 'concurrency = multiprocessing' mà tôi có trong tệp' .coveragerc' của tôi không hoạt động. –

0

Tôi đã dành một chút thời gian cố gắng đảm bảo mức độ phù hợp hoạt động với multiprocessing.Pool nhưng chưa bao giờ hoạt động.

Cuối cùng tôi đã thực hiện một sửa chữa mà làm cho nó hoạt động - sẽ được hạnh phúc nếu có ai đó hướng dẫn tôi nếu tôi làm điều gì đó sai trái.

https://gist.github.com/andreycizov/ee59806a3ac6955c127e511c5e84d2b6