2016-09-28 2 views
4

각 개별 테스트 케이스가 실행되는 데 걸리는 시간 (wall?)을 측정하고 싶습니다.각 장고 테스트의 시간 프로필을 측정하는 방법은 무엇입니까?

나는 test_runner를 timeit에 랩핑한다고 가정 하겠지만, 그 토끼 구멍을 잠수하기 전에 아마도 더 똑똑한 방법이있을 것입니다.

이것은 이미 나에게 기공의 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 보고서는 기본적으로 각 테스트에 소요되는 시간을 보여줍니다.

테스트의 실행 시간이 증가하도록 만들 수 있습니다 쉽게 최적화가 있습니다 장고 특정 문제에 대한

:

  • 사용 SQLite는, 당신은 DB의 특정 기능을 사용하지 않는 경우
  • 가 md5 암호 해시를 사용하거나 암호 해시를 사용하지 마십시오.
  • 마이그레이션을 사용하지 않도록 설정할 수 있습니다.
  • io를 제거하고 가능한 한 많이 로직을 분리하여 복잡한 모델 종속성을 피할 수 있습니다.

얼마나 많은 테스트가 test_dependenciestest_metrics에 있습니까? 어떤 종류의 테스트가 그들에 있습니까?

+0

덕분에 짝을했지만 작동하고 대한의 코를 사용하지 말고, DB는 포스트 그레스 (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를 오버라이드 (override) :

from unittest.runner import TextTestRunner, TextTestResult 

class TimedTextTestRunner(TextTestRunner): 
    resultclass = TimedTextTestResult 

이제 결과 개체는 단지 하나의 그러나 많은 사람들이, 그래서 우리는 테스트에 의해 keyed 시계의 컬렉션이 필요합니다.그런 다음 테스트 시작 시간을 캡처하고 시간이 성공 문자열을 인쇄 할 때 경과를 인쇄 :

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) 
관련 문제