2014-07-10 13 views
12

Hiện nay có một dự án cấu hình để chạy bảo hiểm thông qua quản lý lệnh của Django như vậy:Làm thế nào để kiểm tra vùng phủ sóng đúng với Django + Mũi

Điều này dẫn đến một báo cáo như sau:

Name      Stmts Miss Branch BrMiss Cover Missing 
-------------------------------------------------------------------------- 
notify.decorators    4  1  0  0 75% 4 
notify.handlers     6  1  2  0 88% 11 
notify.notification_types  46  39  2  0 19% 8-55, 59, 62, 66 
notify.notifications   51  51  0  0  0% 11-141 
-------------------------------------------------------------------------- 
TOTAL       107  92  4  0 17% 

Tuy nhiên, có vấn đề với báo cáo này. Nó sai. Bảo hiểm là đánh dấu các dòng bị mất, mặc dù thực tế là chúng thực sự được bao phủ bởi các xét nghiệm. Ví dụ, nếu tôi chạy thử nghiệm qua nosetests thay vì của django quản lý lệnh tôi nhận được báo cáo chính xác sau:

Name      Stmts Miss Branch BrMiss Cover Missing 
----------------------------------------------------------------------------- 
notify.decorators    4  0  0  0 100% 
notify.handlers     6  0  2  0 100% 
notify.notification_types  46  0  2  0 100% 
notify.notifications   51  25  0  0 51% 13, 18, 23, 28, 33, 38, 43, 48, 53, 65, 70, 75, 80, 85, 90, 95, 100, 105, 110, 116, 121, 126, 131, 136, 141 
----------------------------------------------------------------------------- 
TOTAL       107  25  4  0 77% 

Google dẫn tôi Câu hỏi thường gặp trang web của bảo hiểm nhân, http://nedbatchelder.com/code/coverage/faq.html

Q: Tại sao các cơ quan chức năng (hoặc các lớp) hiển thị như được thực hiện, nhưng các dòng def không?

Điều này xảy ra vì phạm vi bảo hiểm được bắt đầu sau khi các hàm được xác định. Các dòng định nghĩa được thực hiện mà không có phép đo vùng phủ sóng, sau đó vùng phủ sóng được bắt đầu, sau đó hàm được gọi. Điều này có nghĩa là cơ thể được đo, nhưng định nghĩa của bản thân hàm đó thì không.

Để khắc phục điều này, hãy bắt đầu bảo hiểm trước đó. Nếu bạn sử dụng dòng lệnh để chạy chương trình của bạn với vùng phủ sóng, thì toàn bộ chương trình của bạn sẽ được giám sát. Nếu bạn đang sử dụng API, bạn cần gọi đến hàm coverage.start() trước khi nhập các mô-đun xác định các chức năng của bạn.

Câu hỏi đặt ra là tôi có thể chạy báo cáo bảo hiểm đúng cách thông qua lệnh quản lý của Django không? Hoặc tôi có phải bỏ qua quản lý để tránh tình huống bắt đầu bảo hiểm sau khi các dòng "thiếu" được thực thi không?

Trả lời

12

Hiện tại, không thể chạy chính xác vùng phủ sóng cùng với django-mũi (vì cách Django 1,7 tải mô hình). Vì vậy, để có được số liệu thống kê bảo hiểm, bạn cần phải sử dụng coverage.py trực tiếp từ dòng lệnh, ví dụ:

$ coverage run --branch --source=app1,app2 ./manage.py test 
$ coverage report 
$ coverage html -d coverage-report 

Bạn có thể đặt thiết lập coverage.py vào tập tin .coveragerc trong thư mục gốc của dự án (các dir giống như quản lý. py).

Sự cố này được báo cáo trên trang GitHub django-mũi: https://github.com/django-nose/django-nose/issues/180 để người bảo trì biết về sự cố, bạn có thể cho họ biết rằng bạn cũng gặp sự cố này.

CẬP NHẬT

eliangcs chỉ ra (vấn đề django-mũi trên GiHub), woraround đó là sửa đổi của bạn manage.py:

import os 
import sys 

if __name__ == "__main__": 
    # ... 
    from django.core.management import execute_from_command_line 

    is_testing = 'test' in sys.argv 

    if is_testing: 
     import coverage 
     cov = coverage.coverage(source=['package1', 'package2'], omit=['*/tests/*']) 
     cov.erase() 
     cov.start() 

    execute_from_command_line(sys.argv) 

    if is_testing: 
     cov.stop() 
     cov.save() 
     cov.report() 

Nó hoạt động, nhưng nó khá "hacky" cách tiếp cận.

UPDATE 2

Tôi khuyên bạn nên cho tất cả mọi người sử dụng mũi để có một cái nhìn tại py.test (http://pytest.org/), mà thực sự là công cụ kiểm tra tốt Python, nó tích hợp tốt với Django, có rất nhiều plugins và nhiều cái khác. Tôi đã sử dụng django-mũi, nhưng cố gắng py.test và không bao giờ nhìn lại.

+1

Đây là giải pháp tiện dụng nhất (mặc dù hacky) và hoạt động hoàn hảo và minh bạch với django-mũi – danigosa

5

Như các tài liệu nói, "sử dụng dòng lệnh để chạy chương trình của bạn với bảo hiểm":

coverage run --branch --source=notify ./manage.py test 
+0

Cảm ơn Ned. Câu hỏi của tôi là cụ thể về việc liệu có thể chạy qua quản lý và nhận được kết quả chính xác hay không. Liệu tôi có đúng khi giả định rằng không, không có cách nào? – kaptainlange

+0

Tôi không biết tại sao - công việc bảo hiểm có đối với một số người chứ không phải những người khác. –

0

tôi đã quản lý để làm việc này bao gồm một

import coverage 

trên đầu trang của tôi manage.py file (Tôi đang sử dụng Flask thay vì gặp vấn đề tương tự)

Vấn đề của tôi là nó hoạt động từ bàn điều khiển nhưng Jenkins không nhận thức được nó và tiếp tục nói rằng những hàng nhập đó nằm ngoài sts ...

Bạn có ý tưởng nào không?

0

Tôi đã gặp sự cố tương tự khi sử dụng trình thông dịch từ xa trong máy ảo thông qua cấu hình ssh. Giải pháp là đặt thư mục kiểm tra của tôi và TẤT CẢ thư mục mẹ của nó trong "Ánh xạ đường dẫn" của phần "Môi trường" của "Chạy"> "Chỉnh sửa cấu hình ...".

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