单元测试时的多个异常和代码覆盖率python
Multiple exceptions and code coverage when unit testing python
问题:
下面是被测代码的人工示例:
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
这是我目前进行的一组测试:
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")
测试通过,如果我 运行 带有 --branch
标志的覆盖率,我将得到 100% 行和分支覆盖率 :
$ 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%
但是,请注意,该测试目前仅检查两种情况 - 未抛出异常时,以及出现 ValueError
异常时。
问题:
当 IndexError
出现时,coverage
有没有办法报告我没有测试案例?
我认为你可以尝试使用两个单独的例外来处理这两个异常。在那种情况下,行覆盖表明您还没有测试一个条件。
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
如果您不想重复您的某些代码,您可以为此使用一个函数。
Coverage.py 只能测量哪些执行路径(语句或分支)是 运行。它无法跟踪使用了哪些值,包括引发了哪些异常类型。
据我所知,您的选择是:
将例外条款分开。在您显示的代码中,无论如何都可以通过不同的行引发这两个异常,尽管在您的实际代码中它们可能不是那么可分离。
这两个异常不用担心。您对此代码的测试可能会考虑许多不同的输入,旨在测试不同的边缘情况。 Coverage.py 无法帮助您区分所有这些,或确保您已经编写了足够多的案例。使用其他标准来确定您是否编写了足够多的测试用例。
问题:
下面是被测代码的人工示例:
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
这是我目前进行的一组测试:
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")
测试通过,如果我 运行 带有 --branch
标志的覆盖率,我将得到 100% 行和分支覆盖率 :
$ 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%
但是,请注意,该测试目前仅检查两种情况 - 未抛出异常时,以及出现 ValueError
异常时。
问题:
当 IndexError
出现时,coverage
有没有办法报告我没有测试案例?
我认为你可以尝试使用两个单独的例外来处理这两个异常。在那种情况下,行覆盖表明您还没有测试一个条件。
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
如果您不想重复您的某些代码,您可以为此使用一个函数。
Coverage.py 只能测量哪些执行路径(语句或分支)是 运行。它无法跟踪使用了哪些值,包括引发了哪些异常类型。
据我所知,您的选择是:
将例外条款分开。在您显示的代码中,无论如何都可以通过不同的行引发这两个异常,尽管在您的实际代码中它们可能不是那么可分离。
这两个异常不用担心。您对此代码的测试可能会考虑许多不同的输入,旨在测试不同的边缘情况。 Coverage.py 无法帮助您区分所有这些,或确保您已经编写了足够多的案例。使用其他标准来确定您是否编写了足够多的测试用例。