mrp/tests/test_performance.py

113 lines
4.0 KiB
Python
Raw Normal View History

# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
import unittest
import time
import logging
from odoo.tests import common, Form
_logger = logging.getLogger(__name__)
class TestMrpSerialMassProducePerformance(common.TransactionCase):
@unittest.skip
def test_smp_performance(self):
total_quantity = 1000
quantity = 1
raw_materials_count = 10
trackings = [
'none',
# 'lot',
# 'serial'
]
_logger.info('setting up environment')
raw_materials = []
for i in range(raw_materials_count):
raw_materials.append(self.env['product.product'].create({
'name': '@raw_material#' + str(i + 1),
'type': 'product',
'tracking': trackings[i % len(trackings)]
}))
finished = self.env['product.product'].create({
'name': '@finished',
'type': 'product',
'tracking': 'serial',
})
bom = self.env['mrp.bom'].create({
'product_id': finished.id,
'product_tmpl_id': finished.product_tmpl_id.id,
'product_uom_id': finished.uom_id.id,
'product_qty': 1.0,
'type': 'normal',
'consumption': 'flexible',
'bom_line_ids': [(0, 0, {'product_id': p[0]['id'], 'product_qty': 1}) for p in raw_materials]
})
form = Form(self.env['mrp.production'])
form.product_id = finished
form.bom_id = bom
form.product_qty = total_quantity
mo = form.save()
mo.action_confirm()
for i in range(raw_materials_count):
if raw_materials[i].tracking == 'none':
self.env['stock.quant'].with_context(inventory_mode=True).create({
'product_id': raw_materials[i].id,
'inventory_quantity': total_quantity,
'location_id': mo.location_src_id.id,
})._apply_inventory()
elif raw_materials[i].tracking == 'lot':
qty = total_quantity
while qty > 0:
lot = self.env['stock.lot'].create({
'product_id': raw_materials[i].id,
'company_id': self.env.company.id,
})
self.env['stock.quant'].with_context(inventory_mode=True).create({
'product_id': raw_materials[i].id,
'inventory_quantity': 10,
'location_id': mo.location_src_id.id,
'lot_id': lot.id,
})._apply_inventory()
qty -= 10
else:
for _ in range(total_quantity):
lot = self.env['stock.lot'].create({
'product_id': raw_materials[i].id,
'company_id': self.env.company.id,
})
self.env['stock.quant'].with_context(inventory_mode=True).create({
'product_id': raw_materials[i].id,
'inventory_quantity': 1,
'location_id': mo.location_src_id.id,
'lot_id': lot.id,
})._apply_inventory()
mo.action_assign()
action = mo.action_serial_mass_produce_wizard()
wizard = Form(self.env['stock.assign.serial'].with_context(**action['context']))
wizard.next_serial_number = "sn#1"
wizard.next_serial_count = quantity
action = wizard.save().generate_serial_numbers_production()
wizard = Form(self.env['stock.assign.serial'].browse(action['res_id']))
wizard = wizard.save()
_logger.info('generating serial numbers')
start = time.perf_counter()
if quantity == total_quantity:
wizard.apply()
else:
wizard.create_backorder()
end = time.perf_counter()
_logger.info('time to produce %s/%s: %s', quantity, total_quantity, end - start)