2009-05-12 27 views
16

SUT tôi trông như thế:Tôi có thể hạn chế đầu ra vùng phủ sóng vào thư mục (thay vì gói) không?

foo.py 
bar.py 
tests/__init__.py [empty] 
tests/foo_tests.py 
tests/bar_tests.py 
tests/integration/__init__.py [empty] 
tests/integration/foo_tests.py 
tests/integration/bar_tests.py 

Khi tôi chạy nosetests --with-coverage, tôi nhận được thông tin chi tiết cho tất cả các loại module mà tôi thà bỏ qua. Nhưng tôi không thể sử dụng tùy chọn --cover-package=PACKAGEfoo.py & bar.py không nằm trong gói . (Xem các chủ đề sau http://lists.idyll.org/pipermail/testing-in-python/2008-November/001091.html vì lý do tôi không đặt chúng trong một gói.)

Tôi có thể hạn chế sản lượng vùng phủ sóng chỉ foo.py & bar.py?

Cập nhật - Giả sử rằng không có một câu trả lời tốt hơn so với Nadia 's dưới đây, tôi đã hỏi một theo dõi câu hỏi: "How do I write some (bash) shell script to convert all matching filenames in directory to command-line options?"

+0

Với phiên bản mới nhất của mũi và vùng phủ sóng, các mã trong các tập tin thử nghiệm bị bỏ qua dưới mũi, vì vậy bạn không nên cần phải xác định gói tại tất cả các. – dbn

Trả lời

21

Bạn có thể sử dụng nó như thế này:

--cover-package=foo --cover-package=bar 

Tôi đã xem nhanh mã nguồn mũi để xác nhận: This is the line

if options.cover_packages: 
     for pkgs in [tolist(x) for x in options.cover_packages]: 
+0

Tôi ấn tượng rằng bạn đã xem xét nguồn. (Tôi nên nghĩ về điều đó.) Nhưng nó cho thấy tôi cần phải sử dụng "--cover-package = foo --cover-package = bar". Nếu bạn sửa đổi câu trả lời của mình, tôi sẽ chấp nhận nó (và bỏ phiếu). –

+1

Cảm ơn ghi chú. Tôi đã sửa câu trả lời. Tôi chưa bao giờ sử dụng mũi trước đây. Nhưng tôi nghĩ tôi sẽ trả lời câu hỏi vì không ai trả lời. –

+0

Cảm ơn Nadia. Bạn vẫn cần phải loại bỏ các phần mở rộng ".py", vì các đối số là các tên gói, không phải tên tệp. –

3

Nếu bạn sử dụng coverage:py 3.0, sau đó mã trong thư mục Python được bỏ qua theo mặc định, bao gồm thư viện chuẩn và tất cả các gói đã cài đặt.

1
touch __init__.py; nosetests --with-coverage --cover-package=`pwd | sed '[email protected]*/@@g'` 
+2

Sẽ tốt nếu bạn có thể thêm một số chi tiết vào câu trả lời của mình. – akjoshi

12

Bạn có thể sử dụng:

--cover-package=. 

hoặc thậm chí thiết lập biến môi trường

NOSE_COVER_PACKAGE=. 

Thử nghiệm với mũi 1.1.2

+0

Tác phẩm này. Cảm ơn. – cnu

+0

Làm cách nào để có thể đạt được điều tương tự với các tùy chọn trong setup.cfg? –

+9

Tôi nhận được bảo hiểm được báo cáo từ các gói trang web bằng cách sử dụng:/ –

2

tôi sẽ làm điều này:

nosetests --with-coverage --cover-package=foo,bar tests/* 

Tôi thích giải pháp này cho những người khác được đề xuất; nó đơn giản nhưng bạn rõ ràng về những gói bạn muốn có bảo hiểm cho. Câu trả lời của Nadia liên quan đến nhiều kiểu gõ thừa, câu trả lời của Stuart sử dụng sed và vẫn tạo ra một gói bằng cách gọi touch __init__.py, và --cover-package=. không hoạt động đối với tôi.

4

Tôi có rất nhiều tệp/gói Python cấp cao nhất và thấy khó chịu khi liệt kê tất cả chúng theo cách thủ công bằng gói -cover, vì vậy tôi đã tạo hai bí danh cho chính mình. Bí danh nosetests_cover sẽ chạy phạm vi phủ sóng với tất cả các tệp/gói Python cấp cao nhất của bạn được liệt kê trong gói -cover. Bí danh nosetests_cover_sort sẽ thực hiện tương tự và bổ sung sắp xếp kết quả của bạn theo tỷ lệ phần trăm phù hợp.

nosetests_cover_cmd="nosetests --with-coverage --cover-erase --cover-inclusive --cover-package=\$(ls | sed -r 's/[.]py$//' | fgrep -v '.' | paste -s -d ',')" 
alias nosetests_cover=$nosetests_cover_cmd 
alias nosetests_cover_sort="$nosetests_cover_cmd 2>&1 | fgrep '%' | sort -nr -k 4" 

Ghi chú:

  • Đây là từ tập tin .bashrc của tôi. Sửa đổi một cách thích hợp nếu bạn không sử dụng bash.
  • Chúng phải được chạy từ thư mục cấp cao nhất của bạn. Nếu không, tên gói sẽ không chính xác và vùng phủ sóng sẽ không xử lý chúng một cách im lặng (tức làthay vì nói với bạn - gói -cover của bạn không chính xác, nó sẽ hoạt động như bạn không cung cấp tùy chọn nào cả).
  • Tôi hiện đang sử dụng Python 2.7.6 trên Ubuntu 13.10, với phiên bản mũi 1.3.0 và phiên bản vùng phủ sóng 3.7.1. Đây là thiết lập duy nhất mà tôi đã thử nghiệm các lệnh này.
  • Khi bạn sử dụng, hãy xóa --cover-erase và --cover-inclusive nếu chúng không phù hợp với nhu cầu của bạn.
  • Nếu bạn muốn sắp xếp theo thứ tự bình thường thay vì thứ tự ngược lại, hãy thay thế -nr bằng -n trong lệnh sắp xếp.
  • Các lệnh này giả định rằng tất cả các tệp/gói Python cấp cao nhất của bạn được đặt tên không có dấu chấm (trừ dấu chấm trong ".py"). Nếu điều này không đúng với bạn, hãy đọc phần Chi tiết bên dưới để hiểu các phần lệnh, sau đó sửa đổi các lệnh khi thích hợp.

chi tiết:

Tôi không cho rằng đây là những lệnh hiệu quả nhất để đạt được kết quả tôi muốn. Chúng chỉ là những mệnh lệnh mà tôi tình cờ nảy ra. = P

Điều chính cần giải thích sẽ là đối số cho gói -cover. Nó xây dựng danh sách bằng dấu phẩy của tên file Python/gói cấp cao nhất (với "py" lột từ tên tập tin) như sau:

  • \$ - thoát nhân vật $ trong một chuỗi dụng dấu ngoặc kép.
  • $() - Chèn kết quả của lệnh chứa bên trong.
  • ls - Liệt kê tất cả các tên trong thư mục hiện tại (phải là thư mục Python cấp cao nhất).
  • | sed -r 's/[.]py$//' - Trong danh sách, thay thế "foo_bar.py" bằng "foo_bar".
  • | fgrep -v '.' - Trong danh sách, xóa tất cả các tên không có dấu chấm (ví dụ: xóa foo_bar.pyc và notes.txt).
  • | paste -s -d ',' - Thay đổi danh sách từ phân cách bằng dòng mới thành phân cách bằng dấu phẩy.

Tôi cũng nên giải thích việc sắp xếp.

  • 2>&1 - Tham gia stderr và stdout.
  • | fgrep '%' - Xóa tất cả các dòng đầu ra mà không có ký tự %.
  • | sort -nr -k 4 - Sắp xếp các dòng còn lại theo thứ tự số ngược lại theo cột thứ 4 (cột là phần trăm tỷ lệ phù hợp). Nếu bạn muốn đặt hàng bình thường thay vì lệnh ngược lại, hãy thay thế -nr bằng -n.

Hy vọng điều này sẽ giúp ai đó! =)

2

Đối với bất kỳ ai cố gắng thực hiện việc này với setup.cfg, các công việc sau đây. Tôi đã gặp một số vấn đề trong việc tìm ra cách chỉ định nhiều gói.

[nosetests] 
with-coverage=1 
cover-html=1 
cover-package=module1,module2 
0

Bạn có thể cải thiện các câu trả lời được chấp nhận như vậy --cover-package=foo,bar

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