python - 在Python单元测试中,SystemExit : False printed even though the test ran "OK"

标签 python unit-testing

我正在编写一个类RecurringInterval,它应该表示周期性间隔,并首先尝试按如下方式测试它:

import datetime
import dateutil.relativedelta
import dateutil.rrule
import dateutil.parser

class RecurringInterval(object):
    def __init__(self, *args, **kwargs):
        self.period = kwargs.pop('period', None)
        assert isinstance(self.period, datetime.timedelta) or isinstance(self.period, dateutil.relativedelta.relativedelta) or (self.period is None)
        self.rrule = dateutil.rrule.rrule(*args, **kwargs)

    def __contains__(self, time):
        last_occurrence = self.rrule.before(time)
        return (last_occurrence <= time) and (time <= last_occurrence + self.period)


if __name__ == "__main__":
    start = dateutil.parser.parse("Thu Nov 24 14:00 UTC 2016")
    recurring_interval = RecurringInterval(dateutil.rrule.DAILY, dtstart=start, count=5, period=datetime.timedelta(hours=2))
    time = dateutil.parser.parse("Thu Nov 24 15:00 UTC 2016")
    print(time in recurring_interval)

运行时,该程序按预期打印 True

接下来,我想将此脚本转换为unittest。我对代码做了以下修改:

import datetime
import dateutil.relativedelta
import dateutil.rrule
import dateutil.parser
import unittest

class RecurringInterval(object):
    def __init__(self, *args, **kwargs):
        self.period = kwargs.pop('period', None)
        assert isinstance(self.period, datetime.timedelta) or isinstance(self.period, dateutil.relativedelta.relativedelta) or (self.period is None)
        self.rrule = dateutil.rrule.rrule(*args, **kwargs)

    def __contains__(self, time):
        last_occurrence = self.rrule.before(time)
        return (last_occurrence <= time) and (time <= last_occurrence + self.period)

class TestRecurringInterval(unittest.TestCase):
    def test_contains_method_for_primary_interval(self):
        start = dateutil.parser.parse("Thu Nov 24 14:00 UTC 2016")
        recurring_interval = RecurringInterval(dateutil.rrule.DAILY, dtstart=start, period=datetime.timedelta(hours=2))
        time = dateutil.parser.parse("Thu Nov 25 15:00 UTC 2016")
        self.assertTrue(time in recurring_interval)

if __name__ == "__main__":
    unittest.main()

但是,当我运行此命令时,出现异常:

In [24]: exec(open('recurring_interval.py').read())
.
----------------------------------------------------------------------
Ran 1 test in 0.002s

OK
An exception has occurred, use %tb to see the full traceback.

SystemExit: False

/usr/local/lib/python3.5/dist-packages/IPython/core/interactiveshell.py:2889: UserWarning: To exit: use 'exit', 'quit', or Ctrl-D.
  warn("To exit: use 'exit', 'quit', or Ctrl-D.", stacklevel=1)

回溯如下:

In [25]: %tb
---------------------------------------------------------------------------
SystemExit                                Traceback (most recent call last)
<ipython-input-24-ab8976376637> in <module>()
----> 1 exec(open('recurring_interval.py').read())

<string> in <module>()

/usr/lib/python3.5/unittest/main.py in __init__(self, module, defaultTest, argv, testRunner, testLoader, exit, verbosity, failfast, catchbreak, buffer, warnings, tb_locals)
     92         self.progName = os.path.basename(argv[0])
     93         self.parseArgs(argv)
---> 94         self.runTests()
     95 
     96     def usageExit(self, msg=None):

/usr/lib/python3.5/unittest/main.py in runTests(self)
    255         self.result = testRunner.run(self.test)
    256         if self.exit:
--> 257             sys.exit(not self.result.wasSuccessful())
    258 
    259 main = TestProgram

SystemExit: False

是什么导致了这个异常?测试没有成功运行吗?

最佳答案

根据 Tests succeed, still get traceback 的回答,回溯是从 iPython 运行脚本的结果,并不表示正在测试的代码有任何“实际”问题。

例如,如果我从命令行运行该程序,我不会得到任何回溯:

kurt@kurt-ThinkPad:~/dev/scratch/Furion_scheduler$ python3 recurring_interval.py 
.
----------------------------------------------------------------------
Ran 1 test in 0.001s

OK

关于python - 在Python单元测试中,SystemExit : False printed even though the test ran "OK",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40788847/

相关文章:

python - 在 Python 2 上的 Django 中使用 __str__() 方法

python - 如何在 python session 中获取 duckdb 可见的类表对象列表?

.net - 给定以下代码,我应该编写哪些测试?

ios - Xcode 单元测试 - 仅为设备构建时出现链接错误

unit-testing - Rhino 模拟 stub 异步方法

python - 如何使用Python库读取稀疏ARFF数据?

python - 如何让多处理运行?

python - Django 高级过滤器在 django-material admin 主题中不起作用

java - powermock+easymock+testng 用于测试 final类

JavaScript 测试 - 使用 jest 模拟来自同一模块的函数