2016-09-28 72 views
4

我想測量每個測試用例運行所花費的時間(牆?)的時間。如何測量每個django測試的時間配置文件?

我想在timeit中包裝test_runner將完成這項工作,但在我潛入這個兔子洞之前,或許有一種更明智的方法來做到這一點?

這已經給我一個cProfile讓毛孔粗大,但沒有什麼東西真的會跳出來像可怕的壞。我在想也許我的時間可以集中在那些跑得最快的時間。

time python -m cProfile -o keep-p4-serialize.profile manage.py test -v 3 -k --parallel 4 

例如:

test_dependencies (api.tests.TestMetricClasses) ... ok (4.003s) 
test_metrics (api.tests.TestMetricClasses) ... ok (8.329s) 
test_parameters (api.tests.TestMetricClasses) ... ok (0.001s) 

回答

0

鼻子具有定時器插件,它記錄每個單個測試執行的壁時間。

https://github.com/mahmoudimus/nose-timer/tree/master/nosetimer

鼻子的coberatura XML報告還顯示,在每個測試中度過,在默認情況下的時間。


Django的具體問題也有一些簡單的優化可以作出增加的測試運行時間:

  • 使用SQLite,如果你不使用DB特定功能
  • 使用md5密碼加密器(或根本沒有密碼加密器)
  • 禁用遷移
  • 刪除io,儘可能隔離邏輯,以避免創建複雜的模型依賴關係

test_dependenciestest_metrics有多少測試?他們有什麼樣的測試?

+0

感謝隊友,但它的工作和他們不要用鼻子,數據庫與postgres綁定,遷移對測試非常重要,這些數字是爲了提供一個例子。但是,嘿,肯定比沒有任何人的迴應好。我很欣賞這種努力。 –

2

這足以讓我的(相對時間),但它不適用於並行測試,並且確實有提高時間精度的範圍。儘管如此:

覆蓋通過settings.py默認亞軍:

TEST_RUNNER = 'myapp.test_runner.MyTestRunner' 

從那裏創建自己的test_runner myapp/test_runner.py

from django.test.runner import DiscoverRunner 

class MyTestRunner(DiscoverRunner): 
    test_runner = TimedTextTestRunner 

,反過來,覆蓋與resultclass:

from unittest.runner import TextTestRunner, TextTestResult 

class TimedTextTestRunner(TextTestRunner): 
    resultclass = TimedTextTestResult 

現在結果對象不僅僅是一個結果但很多,所以我們需要一系列時鐘,通過測試來鎖定。然後捕捉時間的考驗開始,並打印出的時間過去了,當它打印成功的字符串:

class TimedTextTestResult(TextTestResult): 

    def __init__(self, *args, **kwargs): 
     super(TimedTextTestResult, self).__init__(*args, **kwargs) 
     self.clocks = dict() 

    def startTest(self, test): 
     self.clocks[test] = time() 
     super(TextTestResult, self).startTest(test) 
     if self.showAll: 
      self.stream.write(self.getDescription(test)) 
      self.stream.write(" ... ") 
      self.stream.flush() 

    def addSuccess(self, test): 
     super(TextTestResult, self).addSuccess(test) 
     if self.showAll: 
      self.stream.writeln("ok-dokey (%.6fs)" % (time() - self.clocks[test])) 
     elif self.dots: 
      self.stream.write('.') 
      self.stream.flush() 

這給了我的測試報告看起來像這樣:

test_price_impact (api.tests.TestGroupViews) ... ok-dokey (3.123600s) 
test_realised_spread (api.tests.TestGroupViews) ... ok-dokey (6.894571s) 
test_sqrt_trade_value (api.tests.TestGroupViews) ... ok-dokey (0.147969s) 
test_trade_count_share (api.tests.TestGroupViews) ... ok-dokey (3.124844s) 
test_trade_size (api.tests.TestGroupViews) ... ok-dokey (3.134234s) 
test_value_share (api.tests.TestGroupViews) ... ok-dokey (2.939364s)