2016-05-26 24 views
9

Vấn đề:Nhiều trường hợp ngoại lệ và mã số bảo hiểm khi kiểm tra đơn vị python

Dưới đây là một ví dụ nhân tạo của mã dưới kiểm tra:

from datetime import datetime 

def f(s): 
    try: 
     date = s.split(":")[1] 
     return datetime.strptime(date, "%Y%m%d") 
    except (ValueError, IndexError) as e: 
     # some code here 
     raise 

Dưới đây là một loạt các thử nghiệm Tôi hiện có:

from datetime import datetime 
import unittest 

from test_module import f 

class MyTestCase(unittest.TestCase): 
    def test_valid_date(self): 
     self.assertEqual(f("1:20130101"), datetime(2013, 1, 1)) 

    def test_invalid_date(self): 
     self.assertRaises(ValueError, f, "1:invalid") 

Bài kiểm tra trôi qua và nếu tôi chạy vùng phủ sóng với cờ --branch, tôi sẽ nhận được 100% dòng và bảo hiểm chi nhánh:

$ coverage run --branch -m unittest test 
.. 
---------------------------------------------------------------------- 
Ran 2 tests in 0.003s 

OK 
$ coverage report 
Name   Stmts Miss Branch BrPart Cover 
-------------------------------------------- 
test_module.py  7  0  0  0 100% 
-------------------------------------------- 
TOTAL    7  0  0  0 100% 

Tuy nhiên, lưu ý rằng các thử nghiệm hiện kiểm tra chỉ có hai trường hợp - khi không có ngoại lệ ném, và có một ngoại lệ ValueError nâng lên.

Câu hỏi đặt ra:

Có cách nào cho coverage mừng thông báo rằng tôi đã không kiểm tra một trường hợp khi IndexError được nâng lên?

+0

Bạn có thể có một khối ngoại trừ khác cho IndexError. Tôi nghĩ rằng phạm vi bảo hiểm chỉ đếm những dòng đã được thực hiện. –

Trả lời

8

Coverage.py chỉ có thể đo lường đường dẫn thực hiện (câu lệnh hoặc nhánh) nào được chạy. Nó không có phương tiện theo dõi những giá trị nào được sử dụng, bao gồm cả những loại ngoại lệ nào được nêu ra.

Như tôi đã nhìn thấy nó, lựa chọn của bạn là:

  1. riêng các điều khoản ngoại lệ. Trong mã bạn đã cho thấy, hai ngoại lệ có thể được nâng lên bằng các dòng riêng biệt, mặc dù có lẽ trong mã thực của bạn, chúng không thể tách rời được.

  2. Đừng lo lắng về hai ngoại lệ. Thử nghiệm của bạn cho mã này có thể sẽ xem xét một số đầu vào khác nhau, được thiết kế để thực hiện các trường hợp cạnh khác nhau. Coverage.py không thể giúp bạn phân biệt trong số tất cả hoặc đảm bảo rằng bạn đã viết đủ trường hợp. Sử dụng các tiêu chí khác để quyết định bạn đã viết đủ các trường hợp kiểm tra.

+0

Được rồi, cảm ơn rất nhiều. Chúc may mắn với bài nói chuyện của bạn trên PyCon! – alecxe

1

Tôi nghĩ bạn có thể thử với hai ngoại lệ riêng biệt cho hai ngoại lệ. Trong trường hợp đó, phạm vi phủ sóng cho thấy rằng bạn chưa thử nghiệm một điều kiện.

from datetime import datetime 

def f(s): 
    try: 
     date = s.split(":")[1] 
     return datetime.strptime(date, "%Y%m%d") 
    except ValueError as e: 
     # some code here 
     raise 
    except IndexError as e: 
     # some code 
     raise 

Nếu bạn không muốn lặp lại một số mã, bạn có thể sử dụng chức năng cho điều đó.

+0

Đó chắc chắn là một lựa chọn, nhưng sự tò mò của tôi vẫn có câu hỏi đó nếu mức độ phù hợp (hoặc gói khác) sẽ xác định đường dẫn thực thi không được kiểm tra mà không thay đổi mã đang thử nghiệm. Cảm ơn! – alecxe

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