扫码阅读
手机扫码阅读

Odoo | 如何利用向导进行自动化测试??

283 2023-09-08


Odoo

神州数码云基地

在 Odoo 上的尝试、调研与分享



本期内容

利用向导进行自动化测试

一个项目从最初的概念到最终的交付,测试工作是项目全生命周期中必不可少的一环,它直接关系着项目交付的质量。

一个大的项目,如果只靠人工去测试每一项功能,会浪费大量的时间,提高成本,这显然是不行的,那么就引入了自动化测试的概念。【即把以人为驱动的测试行为转化为机器(程序)执行的一种过程。缩短项目周期,提高效率。】

今天就和大家分享一下如何利用Odoo中的向导进行自动化测试。

在了解如何利用向导进行测试之前,我们可以先来了解下Odoo中关于python和JavaScript的测试。

Qunit测试

Odoo中创建视图非常简单,只需简单几行xml, 然后引入文件,就可以实现。

如下所示,其底层采用大量JavaScript来实现。

因此大多数问题在客户端是无法感知的,只在控制台输出。针对该问题,我们可以选择采用Qunit测试用例来JavaScript。

编写测试代码,js文件

odoo.define('colorpicker_tests', function (require) { "use strict";  var FormView = require('web.FormView'); var testUtils = require('web.test_utils'); QUnit.module('Color Picker Tests', { beforeEach: function () {} }, function () { QUnit.test('int_color field test cases', function (assert) { });};

Odoo客户端测试用例使用QUnit框架进行创建,它是针对JavaScript单元测试用例的JQuery框架。

beforeEach函数在运行测试用例之前调用,这有助于初始化测试数据。(beforeEach函数的引用由QUnit框架自身提供。我们在beforeEach函数中初始化了一些数据。)

客户端测试用例在一个隔离的环境(mock)中运行,它不对数据建立连接,因此对于这些测试用例,我们需要创建测试数据。如下所示:

beforeEach: function () { this.data = { book: { fields: { name: { string: "Name", type: "char" }, color: { string: "color", type: "integer"}, }, records: [{ id: 1, name: "Book 1", color: 1 }, { id: 2, name: "Book 2", color: 3 }] } }; }

在内部Odoo创建mock服务来模拟远程过程,调用(RPC)并使用this.data 属性来模拟数据库中的结构和数据。

因此,在beforeEach中,我们在this.data属性中初始化了我们的测试数据。this.data 属性中的键被看作数据表值包含字段的数据表行的信息。

fields键用于定义数据表字段,records键用于数据行。在本例中,我们添加了带有两个属性的book表:name(char)color(integer)

注意在这里,我们可以使用任意Odoo字段,甚至包含关联字段。

例如:{string: “M2o FIeld”, type: “many2one”, relation: ‘partner’}。我们还添加了两条带有records键的图书记录。

QUnit.test('int_color field test cases', function (assert) { assert.expect(2); var form = testUtils.createView({ View: FormView, model: 'book', data: this.data, arch: '
' + '' + '' + '' + '' + '', res_id: 1, viewOptions: { mode: 'edit', }, }); assert.strictEqual( form.$('.o_int_colorpicker .o_color_pill').length, 10, "colorpicker should have 10 pills"); form.$('.o_int_colorpicker .o_color_pill:eq(5)').click(); assert.strictEqual( form.$('.o_int_colorpicker .o_color_5').hasClass('active'), true, "click on pill should make pill active"); form.destroy(); });});

接着,我们添加了带有QUnit.test函数的测试用例。

函数中的第一个参数是一个描述该测试用例的字符串。第二个参数是我们需要为测试用例所添加代码的函数。

这个函数由QUnit框架调用,它传递断言工具作为参数。

本例中, 我们在assert.expect函数中传递了所预期测试用例的数量。我们添加了两个测试用例,因此传递了2。

我们希望在可编辑表单视图中添加测试用例int_color组件,因此我们通过testUtils.createView创建了可编辑表单视图。

createView函数接收不同的参数,如下:

  • View:是你所想要创建的视图的引用。你可以为测试用例创建任意类型的视图,只需在这里传递视图引用即可。

  • model:是给定视图创建所对应模型的名称。所有模型在this.data属性中列出。

  • data:是我们将要在视图中使用的记录。

  • arch:是你所想要创建的视图的定义。因此我们希望测试int_color组件,并传递了带有该组件的视图定义。注意你只能使用在模型中定义的字段。

  • res_id:是所显示记录的记录ID。这个选项仅能用于表单视图。在本例中,表单视图将显示book 1记录的数据,因为我们为res_id传递了1。

  • viewOptions:是在视图中传递的参数。这里,你可以传递所有的有效视图参数,如域、上下文、模式等等。

在通过int_color组件创建了表单视图之后,我们添加了两个测试用例。

第一个用于检查用户界面中色块的个数,第二个测试用例用于检查在点击色块后是否正确激活。

我们从QUnit框架的断言工具中获得了strictEqual函数。如果不匹配,则测试用例失败。

测试用例文件写完之后,得把该文件进行注册,否则该文件不生效。

注册该测试文件

<template id="qunit_suite" name="colorpicker test" inherit_id="web.qunit_suite"> "." position="inside"> 
 src="/my_library/static/tests/colorpicker_tests.js" /> template>

启动测试, 查看是否成功

 python ./odoo-bin -c odoo.conf  --test-enable

以上是关于JavaScript测试用例的简要讲解。接下来我们就来看看如何利用向导进行测试。

向导测试用例

添加向导测试文件、测试用例

odoo.define('my_library.tour', function (require) { "use strict";  var core = require('web.core'); var tour = require('web_tour.tour');  var _t = core._t;  tour.register('library_tour', { url: "/web" },[tour.STEPS.SHOW_APPS_MENU_ITEM, { trigger: '.o_app[data-menu-xmlid="weekly.root"]', content: '点击进入周报应用', position: 'right', edition: 'community' }, { trigger: '.o_menu_header_lvl_1[data-menu-xmlid="weekly.my_weekly_menu"]', content: '选择我的周报', position: 'bottom' }, { trigger: '.o_menu_entry_lvl_2[data-menu-xmlid="weekly.my_weekly_list_menu"]', content: '列表视图,查看我的周报列表', position: 'right' }, { trigger: '.dc_weekly_create', content: '新建工作周报', position: 'right' } ]); });

创建导览测试用例,需要先创建用户界面导览。

这里我们注册了一个新的带有名称library_tour的导览。

同时,我们有一个额外属性:run。在run函数中,我们需要编写逻辑来执行通常由用户所执行的操作。(例如:我们需要模拟用户输入,再使用run函数。)

{ trigger: "input"# jquery 选择器 run: '111111'}{ trigger: "input"# jquery 选择器 run: function(actions){ actions.text('111111'); }}

run函数传递动作工具来作为参数。这为执行基础动作提供了一些快捷方式。最重要的如下所示:

  • actions.click(element):用于点击给定的元素。

  • actions.dblclick(element):用于双击给定的元素。

  • actions.tripleclick(element):用于三击给定的元素。

  • actions.text(string):用于设置输入值。

  • action.drag_and_drop(to, element):用于拖拽元素。

  • action.keydown(keyCodes, element):用于对元素触发指定的键盘事件。

  • action.auto():是默认的动作。在没有向导览步骤传递run函数时,执行的action.auto()。自动动作大多会点击导览步骤中的触发元素。这里唯一的例外是input元素。如果触发元素是input,导览会在其中设置默认值Test。这也是我们不需要为每个步骤添加run函数的原因。

此外,你可以手动执行所有的动作,以防默认动作不能满足要求。

运行测试用例

通过python代码,运行刚刚添加的向导测试用例

from odoo.tests.common import HttpCase, tagged class TestBookUI(HttpCase):  @tagged('post_install', '-at_install') def test_01_book_tour(self): """Books UI tour test case""" self.browser_js("/web", "odoo.__DEBUG__.services['web_tour.tour'].run('library_tour')", "odoo.__DEBUG__.services['web_tour.tour'].tours.library_tour.ready", login="admin")

这里默认会向终端用户显示已注册导览来提升引导体验。

要将它们作为测试用例运行,你需要在 Headless Chrome中运行它们。进行这一实现需要使用HttpCase Python 测试用例。

它会提供browser_js方法,该方法打开URL并执行第二个参数所传递的命令,可以手动运行导览如下:

odoo.__DEBUG__.services['web_tour.tour'].run('library_tour')

在示例中,我们传递了导览的名称作为browser_js方法的参数。

下一个参数用于在执行第一个命令前,等待给定对象准备就绪。

browser_js()方法的最后一个参数是用户名,用于新建测试环境,并且所有的测试动作会以用户的名义执行。

启动服务,在日志中查看结果

python ./odoo-bin -c odoo.conf  --test-enable

# 结果

启程成功后,程序会自动按照下列引导模拟用户进行操作:

到这里,就测试完毕啦!

本期内容就到这里啦

有更好的办法或疑问请

⬇欢迎加入社群一起讨论哦⬇

本期作者

后端开发工程师 喻炎

更多精彩内容

了解云基地,就现在!

IT技术哪家

神州数码最在行

行业新星后起之秀

历史虽不长,但实 力 强

原文链接: http://mp.weixin.qq.com/s?__biz=Mzg5MzUyOTgwMQ==&mid=2247510852&idx=1&sn=251c5d861df367a02527e3938ec65421&chksm=c02f90e2f75819f4da812207eb37e4279d0046188992d26b37d1de474033710fc4b6d27b21fc#rd