2016-11-24 83 views
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 

是什麼原因造成這個例外?測試沒有成功運行?

+1

有一些很好的答案[這裏](http://stackoverflow.com/questions/ 9202772 /試驗,取得成功,仍然得到-回溯)。 –

回答

0

Tests succeed, still get traceback得到答案後,回溯是從iPython運行腳本的結果,並且不會給正在測試的代碼發出任何「實際」問題。

例如,如果我在命令行中運行這個程序,我沒有得到任何回溯:

[email protected]:~/dev/scratch/Furion_scheduler$ python3 recurring_interval.py 
. 
---------------------------------------------------------------------- 
Ran 1 test in 0.001s 

OK