赞
踩
一、@profile测试方法的性能
代码:
from odoo.tools.profiler import profile
方法前加
@profile
结果:
x_wizard ---------------------------- d:\program files\odoo 14.0.20201105\server\odoo\myaddons\zcpd\models\wizard.py, 31
1 0 0.0 @profile
@api.model
def default_get(self, default_fields):
“”"
为向导赋默认值。
“”"
1 0 0.0 nd = str(date.today().year)
1 2 14.52 result = super(x_wizard, self).default_get(default_fields)
1 0 0.0 result.update({
1 0 0.0 ‘nd’:nd,
})
1 0 0.0 return result
Total:
1 2 14.52
二、压力测试
我们都知道,互联网应用必须要做的一步就是压力测试,因为每天互联网应用都要面对成千上万的请求。虽然Odoo的定位是企业内部应用,但一旦企业规模变大,服务器也面临着并发带来的压力,因此压力测试也是Odoo运维过程中必不可少的环节之一。本章将带领读者使用Python的压力测试工具Locust来对我们的Odoo应用进行压力测试评估。
任何系统不论如何优化,都会又一个性能的瓶颈,我们做压力测试的目的就是想要知道在一定标准的范围内,服务器经过最优优化后的极限性能在哪,以便我们在预估服务器到达性能极限之前及时对软硬件进行升级,以应对即将到来的压力挑战。
Locust简介
Locust是Python写的压力测试工具,拥有简单明了的UI控制界面和图形报表,而且支持分布式测试。写一个Locust测试脚步也非常简单。
首先,我们安装这个工具:
pip install locustio
启动命令:
locust -f locust_files/my_locust_file.py --host=http://example.com
f 参数指明脚本文件所在目录 host 参数为web访问地址,通常设置为ip地址或者0.0.0.0即可。
启动后可以看到日志输出:
kevin@kevin:~/codes/script/python/locust_test$ locust -f odoo_test.py --host=http://0.0.0.0
[2019-08-26 13:07:40,330] kevin/INFO/locust.main: Starting web monitor at *:8089
[2019-08-26 13:07:40,331] kevin/INFO/locust.main: Starting Locust 0.11.0
[2019-08-26 13:07:48,618] kevin/INFO/locust.runners: Hatching and swarming 200 clients at the rate 1 clients/s...
[2019-08-26 13:12:31,373] kevin/INFO/locust.runners: All locusts hatched: Tester: 200
编写脚步测试文件
我们新建了一个Controller,用于接收Locust发出的请求,简单起见没有做登陆认证。
class LocustTest(http.Controller): @http.route('/locust_test/locust_test/', auth='public') def index(self, **kw): return "Hello, world" @http.route('/locust_test/locust_test/write/', auth='public') def list(self, **kw): # return http.request.render('locust_test.listing', { # 'root': '/locust_test/locust_test', # 'objects': http.request.env['locust_test.locust_test'].search([]), # }) sale_obj = request.env["sale.order"].sudo() # 创建订单 order = sale_obj.create({ "partner_id":7, "order_line":[(0,0,{ "product_id":1, })] }) # 删除订单 order.unlink() return "Test Done"
然后我们编写压力测试脚本:
from locust import HttpLocust,TaskSet,task
class TestOdoo(TaskSet):
def on_start(self):
self.test_sale_order()
@task(1)
def test_sale_order(self):
self.client.get("http://192.168.23.129:8070/locust_test/locust_test/write/")
class Tester(HttpLocust):
task_set = TestOdoo
min_wait = 50
max_wait = 200
启动测试
我们打开Locust控制页面:
我的测试虚拟机1核2G内存,200用户1并发的结果如下:
也可以看到请求曲线:
可以看到我的小服务器能够支持每秒8个请求的处理。
三、用例测试(单元测试)
设计方法
1、白盒法
白盒法又称结构化方法(结构测试)或逻辑覆盖法,其基本思想是把程序看作是路径的集合。这样,对程序的测试便转化为对程序中某些路径的测试,要设法让被测程序的“各处”均被执行到,使潜伏在程序每个角落的错误均有机会暴露出来。因此,白盒法实际上是一种选择通过指定路径的输入数据的分析方法。
2、测试覆盖率
采用白盒法可以用测试覆盖率作为测试彻底度的定量衡量标准。常用的覆盖率有:
(1)语句覆盖:要求设计足够的测试数据,使程序的每条语句都至少执行一次。
(2)判定覆盖(分支覆盖):使程序中的每个判定至少出现一次“真值”和一次假值”,即程序中的每个判定(分支)都至少要经过一次。
(3)条件覆盖:使判定中每个条件的所有可能的结果至少出现一次,并且使每条语句至少执行一次。
(4)判定条件覆盖:使判定覆盖和条件覆盖同时得到满足。
(5)多重条件覆盖:又称条件的组合覆盖,是使程序中每个判定中的条件的各种组合都至少取到一次,并且每条语句至少执行一次。
此外,还有诸如路径覆盖(程序中每条路径至少执行一次)、基本路径覆盖(循环次数只考虑小于等于一次所组成的程序路径,每条基本路径至少执行一次)等。为了获取测试覆盖率(不论是哪一种覆盖率)需要有测试工具的帮助,且需要花费人力与机时去做测试工作(设计测试用例、输入测试数据、进行统计计算等)。
3、黑盒法
黑盒法又称为功能测试,是根据软件需求说明书上罗列的各项功能、性能指标,来构造测试用例的输入数据,实际执行被测软件,分析执行过程的行为与执行结果以便检查出被测软件的错误。在黑盒法测试中,测试者可以完全不关心程序的内部结构。可见,白盒法是一种逻辑驱动方法,而黑盒法是一种功能驱动方法。黑盒法是最常用的测试方法。
Odoo使用unittest为测试模块提供支持。
具体实现:
1、安装python库(安装时间较长):
pip3 install unitest
要编写测试,只需在模块中定义tests子包,就会自动检查测试模块。 测试模块的名称应该以test_开头,并且应该从tests / __ init__.py导入,例如:
your_module
|-- …
-- tests |-- __init__.py |-- test_bar.py– test_foo.py
列图:
和__init__.py包含:
from . import test_foo, test_bar
列图:
警告
未从tests / __ init__.py导入的测试模块将不会运行
在8.0版中更改:之前,测试运行器只运行添加到两个列表fast_suite的模块并checks在tests / __ init__.py。 在8.0中,它将运行所有导入的模块
class odoo.tests.common.TransactionCase(methodName=‘runTest’)
TestCase,其中每个测试方法都在自己的事务中运行,并带有自己的游标。 回滚事务并在每次测试后关闭游标。
browse_ref(xid)
返回提供的外部标识符的记录对象
Parameters:xid --完全限定的外部标识符,格式为module.identifier
Raise: ValueError if not found
Returns:Basemodel
ref(xid)
返回提供的外部标识符的数据库ID,get_object_reference的快捷方式
Parameters:xid- -完全限定的外部标识符,格式为module.identifier
Raise: ValueError if not found
Returns:registered id
默认情况下,在安装相应模块后立即运行测试。 测试用例也可以配置为在安装所有模块后运行,而不是在模块安装后立即运行:
odoo.tests.common.at_install(flag)
设置测试的at-install状态,该标志是一个布尔值,指定在模块安装期间测试应该(True)还是不应该(False)运行。
默认情况下,在开始安装下一个模块之前,在安装模块后立即运行测试。
odoo.tests.common.post_install(flag)
设置测试的安装后状态。 该标志是一个布尔值,指定在一组模块安装之后是否应该运行测试。
默认情况下,在安装当前安装集中的所有模块后,不会运行测试。
最常见的情况是使用TransactionCase并在每个方法中测试模型的属性:
class TestModelA(common.TransactionCase):
def test_some_action(self):
record = self.env['model.a'].create({'field': 'value'})
record.some_action()
self.assertEqual(
record.field,
expected_field_value)
1
测试方法必须从test_开始
Running tests
如果在启动Odoo服务器时启用了–test-enable,则在安装或更新模块时会自动运行测试。
从Odoo 8开始,不支持在安装/更新周期之外运行测试。
Testing JS code
Qunit test suite
Odoo Web包括对Odoo Web的核心代码和您自己的javascript模块进行单元测试的方法。 在javascript方面,单元测试基于QUnit,其中包含许多帮助程序和扩展,可以更好地与Odoo集成。
要查看运行器的外观,找到(或启动)启用了Web客户端的Odoo服务器,然后导航到/ web / tests这将显示运行器选择器,它会列出所有带有javascript单元测试的模块,并允许启动任何 他们(或所有模块中的所有javascript测试)。
单击任何运行器按钮将在捆绑的QUnit运行器中启动相应的测试:
Integration Testing(集成测试)
单独测试Python代码和JS代码非常有用,但它并不能证明Web客户端和服务器协同工作。 为了做到这一点,我们可以编写另一种测试:游览。 游览是一些有趣的业务流程的迷你场景。 它解释了应遵循的一系列步骤。 然后,测试运行器将创建一个phantom_js浏览器,将其指向正确的URL并根据场景模拟点击和输入。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。