odoo+测试

一、@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)

other tests…

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并根据场景模拟点击和输入。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值