From c6bec8103975e42f02c9517ebebb5d246fd2e900 Mon Sep 17 00:00:00 2001 From: Kazuhiko Shiozaki <kazuhiko@nexedi.com> Date: Sun, 28 Sep 2008 10:49:23 +0000 Subject: [PATCH] * add a new test to measure time to render object view with many lines. (target time is TBD). * add PROFILE variable to get hotshot profiler's result. git-svn-id: https://svn.erp5.org/repos/public/erp5/trunk@23873 20353a03-c40f-0410-a6d1-a30d3c3de9de --- product/ERP5Type/tests/testPerformance.py | 53 +++++++++++++++++++++++ 1 file changed, 53 insertions(+) diff --git a/product/ERP5Type/tests/testPerformance.py b/product/ERP5Type/tests/testPerformance.py index 2d756df031..0e9e250697 100644 --- a/product/ERP5Type/tests/testPerformance.py +++ b/product/ERP5Type/tests/testPerformance.py @@ -34,12 +34,15 @@ from DateTime import DateTime from Products.ERP5Type.tests.ERP5TypeTestCase import ERP5TypeTestCase from zLOG import LOG from Products.CMFCore.tests.base.testcase import LogInterceptor +import os, hotshot # Define variable to chek if performance are good or not # XXX These variable are specific to the testing environment # (which has 31645.6 pystones/second) MIN_OBJECT_VIEW=0.112 MAX_OBJECT_VIEW=0.122 +MIN_OBJECT_MANY_LINES_VIEW=0.2500 +MAX_OBJECT_MANY_LINES_VIEW=0.3000 MIN_OBJECT_PROXYFIELD_VIEW=0.1990 MAX_OBJECT_PROXYFIELD_VIEW=0.2200 CURRENT_MIN_OBJECT_VIEW=0.1220 @@ -53,6 +56,9 @@ MAX_TIC=0.0355 LISTBOX_COEF=0.02472 DO_TEST = 1 +# set 1 to get hotshot profiler's result (unit_test/tests/<func_name>) +PROFILE=0 + class TestPerformance(ERP5TypeTestCase, LogInterceptor): # Some helper methods @@ -126,10 +132,22 @@ class TestPerformance(ERP5TypeTestCase, LogInterceptor): if not quiet: print "%s time to view object form %.4f < %.4f < %.4f\n" % \ (prefix, min, req_time, max) + if PROFILE: + self.profile(bar.Bar_viewPerformance) if DO_TEST: self.failUnless(min < req_time < max, '%.4f < %.4f < %.4f' % (min, req_time, max)) + def profile(self, func): + prof_file = func.__name__ + try: + os.unlink(prof_file) + except OSError: + pass + prof = hotshot.Profile(prof_file) + prof.runcall(func) + prof.close() + def test_00_viewBarObject(self, quiet=quiet, run=run_all_test, min=None, max=None): """ @@ -189,6 +207,8 @@ class TestPerformance(ERP5TypeTestCase, LogInterceptor): tic_result[key] = (after_tic - before_tic)/100. add_result[key] = (after_add - before_add)/100. + if PROFILE: + self.profile(self.bar_module.BarModule_viewBarList) # check result keys = view_result.keys() keys.sort() @@ -252,6 +272,39 @@ class TestPerformance(ERP5TypeTestCase, LogInterceptor): req_time, MAX_OBJECT_PROXYFIELD_VIEW)) + def test_02_viewFooObjectWithManyLines(self, quiet=quiet): + """ + Estimate average time to render object view with many lines + """ + foo = self.foo_module.newContent(portal_type='Foo', + title='Foo Test') + for i in xrange(100): + foo.newContent(portal_type='Foo Line', + title='Line %s' % i) + get_transaction().commit() + self.tic() + # Check performance + before_view = time() + for x in xrange(100): + foo.Foo_view() + after_view = time() + req_time = (after_view - before_view)/100. + + if not quiet: + print "time to view object form with many lines %.4f < %.4f < %.4f\n" % \ + ( MIN_OBJECT_MANY_LINES_VIEW, + req_time, + MAX_OBJECT_MANY_LINES_VIEW ) + if PROFILE: + self.profile(foo.Foo_view) + if DO_TEST: + self.failUnless( MIN_OBJECT_MANY_LINES_VIEW < req_time + < MAX_OBJECT_MANY_LINES_VIEW, + '%.4f < %.4f < %.4f' % ( + MIN_OBJECT_MANY_LINES_VIEW, + req_time, + MAX_OBJECT_MANY_LINES_VIEW)) + def test_suite(): suite = unittest.TestSuite() suite.addTest(unittest.makeSuite(TestPerformance)) -- 2.30.9