From eee03e9ce0d72b9c21c5fbecf9ad834c32f3dff2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thibault=20Delavall=C3=A9e?= Date: Wed, 1 Dec 2021 11:20:32 +0000 Subject: [PATCH] [IMP] test_event_full: add performance tests Add performance test for event and registration creation. This serves as a base for future cleaning and improvements for both models and performance in event models targeting v16. Task-2703285 (Event performance improvements) Task-2703289 (Event testing and coverage) Part-of: odoo/odoo#81068 --- addons/test_event_full/tests/__init__.py | 1 + .../test_event_full/tests/test_performance.py | 334 ++++++++++++++++++ 2 files changed, 335 insertions(+) create mode 100644 addons/test_event_full/tests/test_performance.py diff --git a/addons/test_event_full/tests/__init__.py b/addons/test_event_full/tests/__init__.py index 9292333c6d9..f29bd66c342 100644 --- a/addons/test_event_full/tests/__init__.py +++ b/addons/test_event_full/tests/__init__.py @@ -5,4 +5,5 @@ from . import common from . import test_event_crm from . import test_event_event from . import test_event_security +from . import test_performance from . import test_wevent_register diff --git a/addons/test_event_full/tests/test_performance.py b/addons/test_event_full/tests/test_performance.py new file mode 100644 index 00000000000..30bfdda015f --- /dev/null +++ b/addons/test_event_full/tests/test_performance.py @@ -0,0 +1,334 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from datetime import timedelta +from freezegun import freeze_time + +from odoo.addons.test_event_full.tests.common import TestEventFullCommon +from odoo.tests.common import users, warmup, Form +from odoo.tests import tagged + + +@tagged('event_performance') +class EventPerformanceCase(TestEventFullCommon): + + def setUp(self): + super(EventPerformanceCase, self).setUp() + # patch registry to simulate a ready environment + self.patch(self.env.registry, 'ready', True) + self._flush_tracking() + + def _flush_tracking(self): + """ Force the creation of tracking values notably, and ensure tests are + reproducible. """ + self.env['base'].flush() + self.cr.flush() + + +@tagged('event_performance') +class TestEventPerformance(EventPerformanceCase): + + @users('event_user') + @warmup + def test_event_create_batch_notype(self): + """ Test multiple event creation (import) """ + batch_size = 20 + + # simple without type involved + with freeze_time(self.reference_now), self.assertQueryCount(event_user=459): # tef only: 459 (453) - com runbot: 453 - ent runbot 453 + self.env.cr._now = self.reference_now # force create_date to check schedulers + event_values = [ + dict(self.event_base_vals, + website_menu=False) + for x in range(batch_size) + ] + self.env['event.event'].create(event_values) + + @users('event_user') + @warmup + def test_event_create_batch_notype_website(self): + """ Test multiple event creation (import) """ + batch_size = 20 + + # simple without type involved + website + with freeze_time(self.reference_now), self.assertQueryCount(event_user=5604): # tef only: 5179 (5174) - com runbot: 5178 - ent runbot 5603 + self.env.cr._now = self.reference_now # force create_date to check schedulers + event_values = [ + dict(self.event_base_vals, + website_menu=True + ) + for x in range(batch_size) + ] + self.env['event.event'].create(event_values) + + @users('event_user') + @warmup + def test_event_create_batch_wtype(self): + """ Test multiple event creation (import) """ + batch_size = 20 + event_type = self.env['event.type'].browse(self.test_event_type.ids) + + # complex with type + with freeze_time(self.reference_now), self.assertQueryCount(event_user=804): # tef only: 804 (798) - com runbot: 798 - ent runbot 798 + self.env.cr._now = self.reference_now # force create_date to check schedulers + event_values = [ + dict(self.event_base_vals, + event_type_id=event_type.id, + website_menu=False, + ) + for x in range(batch_size) + ] + self.env['event.event'].create(event_values) + + @users('event_user') + @warmup + def test_event_create_batch_wtype_website(self): + """ Test multiple event creation (import) """ + batch_size = 20 + event_type = self.env['event.type'].browse(self.test_event_type.ids) + + # complex with type + website + with freeze_time(self.reference_now), self.assertQueryCount(event_user=5956): # tef only: 5531 (5526) - com runbot: 5530 - ent runbot 5955 + self.env.cr._now = self.reference_now # force create_date to check schedulers + event_values = [ + dict(self.event_base_vals, + event_type_id=event_type.id, + ) + for x in range(batch_size) + ] + self.env['event.event'].create(event_values) + + + @users('event_user') + @warmup + def test_event_create_form_notype(self): + """ Test a single event creation using Form """ + has_social = 'social_menu' in self.env['event.event'] # otherwise view may crash in enterprise + + # no type, no website + with freeze_time(self.reference_now), self.assertQueryCount(event_user=240): # tef only: 186 - com runbot: 185 + self.env.cr._now = self.reference_now # force create_date to check schedulers + with Form(self.env['event.event']) as event_form: + event_form.name = 'Test Event' + event_form.date_begin = self.reference_now + timedelta(days=1) + event_form.date_end = self.reference_now + timedelta(days=5) + event_form.website_menu = False + if has_social: + event_form.social_menu = False + _event = event_form.save() + + @users('event_user') + @warmup + def test_event_create_form_notype_website(self): + """ Test a single event creation using Form """ + has_social = 'social_menu' in self.env['event.event'] # otherwise view may crash in enterprise + + # no type, website + with freeze_time(self.reference_now), self.assertQueryCount(event_user=748): # tef only: 632 - com runbot: 632 + self.env.cr._now = self.reference_now # force create_date to check schedulers + with Form(self.env['event.event']) as event_form: + event_form.name = 'Test Event' + event_form.date_begin = self.reference_now + timedelta(days=1) + event_form.date_end = self.reference_now + timedelta(days=5) + event_form.website_menu = True + if has_social: + event_form.social_menu = False + _event = event_form.save() + + @users('event_user') + @warmup + def test_event_create_form_type_website(self): + """ Test a single event creation using Form """ + event_type = self.env['event.type'].browse(self.test_event_type.ids) + has_social = 'social_menu' in self.env['event.event'] # otherwise view may crash in enterprise + + # type and website + with freeze_time(self.reference_now), self.assertQueryCount(event_user=795): # tef only: 681 - com runbot: 683 + self.env.cr._now = self.reference_now # force create_date to check schedulers + with Form(self.env['event.event']) as event_form: + event_form.name = 'Test Event' + event_form.date_begin = self.reference_now + timedelta(days=1) + event_form.date_end = self.reference_now + timedelta(days=5) + event_form.event_type_id = event_type + if has_social: + event_form.social_menu = False + + @users('event_user') + @warmup + def test_event_create_single_notype(self): + """ Test a single event creation """ + # simple without type involved + with freeze_time(self.reference_now), self.assertQueryCount(event_user=41): # tef only: 41 (35) - com runbot: 35 + self.env.cr._now = self.reference_now # force create_date to check schedulers + event_values = dict( + self.event_base_vals, + website_menu=False + ) + self.env['event.event'].create([event_values]) + + @users('event_user') + @warmup + def test_event_create_single_notype_website(self): + """ Test a single event creation """ + # simple without type involved + website + with freeze_time(self.reference_now), self.assertQueryCount(event_user=379): # tef only: 353 (348) - com runbot: 352 - ent runbot 378 + self.env.cr._now = self.reference_now # force create_date to check schedulers + event_values = dict( + self.event_base_vals, + website_menu=True + ) + self.env['event.event'].create([event_values]) + + @users('event_user') + @warmup + def test_event_create_single_wtype(self): + """ Test a single event creation """ + event_type = self.env['event.type'].browse(self.test_event_type.ids) + + # complex with type + with freeze_time(self.reference_now), self.assertQueryCount(event_user=81): # tef only: 81 (75) - com runbot: 75 - ent runbot 75 + self.env.cr._now = self.reference_now # force create_date to check schedulers + event_values = dict( + self.event_base_vals, + event_type_id=event_type.id, + website_menu=False + ) + self.env['event.event'].create([event_values]) + + @users('event_user') + @warmup + def test_event_create_single_wtype_website(self): + """ Test a single event creation """ + event_type = self.env['event.type'].browse(self.test_event_type.ids) + + # complex with type + website + with freeze_time(self.reference_now), self.assertQueryCount(event_user=426): # tef only: 400 (395) - com runbot: 399 - ent runbot 425 + self.env.cr._now = self.reference_now # force create_date to check schedulers + event_values = dict( + self.event_base_vals, + event_type_id=event_type.id, + ) + self.env['event.event'].create([event_values]) + + +@tagged('event_performance', 'registration_performance') +class TestRegistrationPerformance(EventPerformanceCase): + + @users('event_user') + @warmup + def test_registration_create_batch(self): + """ Test multiple registrations creation (batch of 10 without partner + and batch of 10 with partner) + + # TODO: with self.profile(collectors=['sql']) as _profile: + """ + event = self.env['event.event'].browse(self.test_event.ids) + + with freeze_time(self.reference_now), self.assertQueryCount(event_user=873): # tef only: 828 - com runbot 871 + self.env.cr._now = self.reference_now # force create_date to check schedulers + registration_values = [ + dict(reg_data, + event_id=event.id) + for reg_data in self.customer_data + ] + registration_values += [ + {'event_id': event.id, + 'partner_id': partner.id, + } for partner in self.partners + ] + self.env['event.registration'].create(registration_values) + + @users('event_user') + @warmup + def test_registration_create_batch_website(self): + """ Test multiple registrations creation (batch of 10 without partner + and batch of 10 with partner) with some additional informations (register + form like) """ + event = self.env['event.event'].browse(self.test_event.ids) + + with freeze_time(self.reference_now), self.assertQueryCount(event_user=944): # tef only: 898 - com runbot 941 + self.env.cr._now = self.reference_now # force create_date to check schedulers + registration_values = [ + dict(reg_data, + event_id=event.id) + for reg_data in self.website_customer_data + ] + registration_values += [ + {'event_id': event.id, + 'partner_id': partner.id, + 'registration_answer_ids': self.website_customer_data[0]['registration_answer_ids'], + } for partner in self.partners + ] + self.env['event.registration'].create(registration_values) + + @users('event_user') + @warmup + def test_registration_create_form_customer(self): + """ Test a single registration creation using Form """ + event = self.env['event.event'].browse(self.test_event.ids) + + with freeze_time(self.reference_now), self.assertQueryCount(event_user=238): # tef only: 218 - com runbot 223 + self.env.cr._now = self.reference_now # force create_date to check schedulers + with Form(self.env['event.registration']) as reg_form: + reg_form.event_id = event + reg_form.email = 'email.00@test.example.com' + reg_form.mobile = '0456999999' + reg_form.name = 'My Customer' + reg_form.phone = '0456000000' + _registration = reg_form.save() + + @users('event_user') + @warmup + def test_registration_create_form_partner(self): + """ Test a single registration creation using Form """ + event = self.env['event.event'].browse(self.test_event.ids) + + with freeze_time(self.reference_now), self.assertQueryCount(event_user=241): # tef only: 221 - com runbot 225 + self.env.cr._now = self.reference_now # force create_date to check schedulers + with Form(self.env['event.registration']) as reg_form: + reg_form.event_id = event + reg_form.partner_id = self.partners[0] + _registration = reg_form.save() + + @users('event_user') + @warmup + def test_registration_create_single_customer(self): + """ Test a single registration creation """ + event = self.env['event.event'].browse(self.test_event.ids) + + # simple customer data + with freeze_time(self.reference_now), self.assertQueryCount(event_user=144): # tef only: 137 - com runbot 142 + self.env.cr._now = self.reference_now # force create_date to check schedulers + registration_values = dict( + self.customer_data[0], + event_id=event.id) + self.env['event.registration'].create([registration_values]) + + @users('event_user') + @warmup + def test_registration_create_single_partner(self): + """ Test a single registration creation """ + event = self.env['event.event'].browse(self.test_event.ids) + + # partner-based customer + with freeze_time(self.reference_now), self.assertQueryCount(event_user=151): # tef only: 145 - com runbot 150 + self.env.cr._now = self.reference_now # force create_date to check schedulers + registration_values = { + 'event_id': event.id, + 'partner_id': self.partners[0].id, + } + self.env['event.registration'].create([registration_values]) + + @users('event_user') + @warmup + def test_registration_create_single_website(self): + """ Test a single registration creation """ + event = self.env['event.event'].browse(self.test_event.ids) + + # website customer data + with freeze_time(self.reference_now), self.assertQueryCount(event_user=155): # tef only: 146 - com runbot 151 + self.env.cr._now = self.reference_now # force create_date to check schedulers + registration_values = dict( + self.website_customer_data[0], + event_id=event.id) + self.env['event.registration'].create([registration_values])