Làm cách nào để có được mã vùng phủ sóng của mã xem của dự án Django (và mã được gọi bằng mã xem)?Cách lấy dữ liệu vùng phủ sóng từ ứng dụng django khi chạy trong gunicorn
coverage gunicorn <params>
không hiển thị bất kỳ dòng nào bị trúng.
Làm cách nào để có được mã vùng phủ sóng của mã xem của dự án Django (và mã được gọi bằng mã xem)?Cách lấy dữ liệu vùng phủ sóng từ ứng dụng django khi chạy trong gunicorn
coverage gunicorn <params>
không hiển thị bất kỳ dòng nào bị trúng.
coverage gunicorn <params>
không hoạt động, vì gunicorn tạo quy trình công nhân và mô-đun coverage
không thể hoạt động trên các nhánh (về cơ bản, tạo các quy trình mới). Bạn có thể sử dụng the coverage API Mặc dù vậy, ví dụ như trong các mô-đun python có chứa ứng dụng WSGI của bạn:
# wsgi_with_coverage.py
import atexit
import sys
import coverage
cov = coverage.coverage()
cov.start()
from wsgi import application # adjust to python module containing your wsgi application
def save_coverage():
print >> sys.stderr, "saving coverage"
cov.stop()
cov.save()
atexit.register(save_coverage)
Sau đó chạy gunicorn -w 1 wsgi_with_coverage:application <other params>
.
Vấn đề là, các chức năng atexit
không được gọi nếu bạn giết quá trình gunicorn, ví dụ: thông qua CTRL + C. Nhưng họ là được gọi là SIGHUP
, vì vậy nếu bạn làm kill -HUP $(cat <gunicorn_pidfile_here>)
, dữ liệu bảo hiểm phải được lưu (theo mặc định thành ".coverage" trong thư mục hiện tại).
Có thể báo trước là điều này sẽ không hoạt động với nhiều hơn một nhân viên gunicorn, bởi vì tất cả họ sẽ ghi đè lên tệp ".coverage". Nếu bạn hoàn toàn cần nhiều hơn một công nhân, bạn có thể viết thư cho ".coverage-%d" % os.getpid()
(đặt tên tệp via the data_file
parameter to the coverage
constructor) và sử dụng the combine()
method để hợp nhất các phép đo riêng lẻ.
Điều này cũng sẽ hoạt động trên các máy chủ WSGI khác, tùy thuộc vào việc liệu chúng có cho phép quy trình làm việc của nhân viên dọn sạch thông qua phương thức atexit
hay không.
Lời khuyên SIGHUP không tốt lắm :). Gunicorn tải lại các quy trình công nhân khi truy xuất SIGHUP. Tức là, dữ liệu được thu thập chính xác không được lưu, nhưng được ghi đè bằng những điều chỉ xảy ra khi tải. Việc gửi SIGTER, mặt khác, kích hoạt đúng trình xử lý ngoại tuyến và tắt Gunicorn một cách rõ ràng. –