Odoo | 如何利用向导进行自动化测试??
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",
run: '111111',
}
或
{
trigger: "input" ,
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技术哪家强
神州数码最在行
行业新星,后起之秀
历史虽不长,但是实 力 强