0
我正在寫一個類RecurringInterval
這應該代表的週期性間隔,並試圖先對其進行測試,如下所示:在Python單元測試,SystemExit:假印,即使測試跑「OK」
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
是什麼原因造成這個例外?測試沒有成功運行?
有一些很好的答案[這裏](http://stackoverflow.com/questions/ 9202772 /試驗,取得成功,仍然得到-回溯)。 –