博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【odoo14】第十八章、自动化测试
阅读量:456 次
发布时间:2019-03-06

本文共 7910 字,大约阅读时间需要 26 分钟。

转:

当我们开发大型应用的时候,通过自动化测试可以大幅提高应用的健壮性。每年,odoo都会发布新版本,自动化测试对于应用的回归测试非常有帮助。幸运的是,odoo框架有不同自动化测试用例。odoo主要包括三种测试方案:

  • Python test case: 用于测试Python的业务逻辑测试
  • JavaScript Qunit test: 用于测试JavaScript的实现
  • Tours: 用于测试Python和JavaScript的交互情况

本章包含:

  • 添加python测试用例
  • 运行python测试用例
  • 为客户端侧的测试用例配置(Headless Chrome)
  • 添加客户端侧的QUnit测试用例
  • 添加向导的测试用例
  • 运行客户端侧的测试用用例
  • 调试测试端侧的测试用例
  • 为失败的测试用例生成视频或屏幕截图
  • 为测试填充随机数据

技术需求

本章,我们将详细讨论测试用例的情况。为了能覆盖所有的应用场景,我们创建了一个新的模型。模型如下:

class LibraryBook(models.Model):    _name = 'library.book'    name = fields.Char('Title', required=True)     date_release = fields.Date('Release Date')     author_ids = fields.Many2many('res.partner',    string='Authors')    state = fields.Selection(    [('draft', 'Not Available'), ('available', 'Available'), ('lost', 'Lost')],    'State', default="draft") color = fields.Integer()def make_available(self):     self.write({'state': 'available'})def make_lost(self):     self.write({'state': 'lost'})

对于JavaScript的测试用例,我们将使用第十五章中"创建用户小部件"一节中的int_color小部件。

你可以在 (github)[ https://github.com/PacktPublishing/Odoo-14-Development-Cookbook-Fourth-Edition/tree/master/Chapter18/00_initial_module]

添加python测试用例

Python的测试用例用于测试业务逻辑的可用性。第五章,“服务器侧开发-基础篇”,我们了解了如何调整现有业务逻辑。由于对现有模型的修改有可能会破坏原有的逻辑,测试就显得尤为重要。在本节,我们将创建用于验证改变图书状态的业务逻辑。

准备

步骤

  1. 添加文件tests/__init__.py
from . import test_book_state
  1. 添加tests/test_book_state.py文件
from odoo.tests.common import TransactionCaseclass TestBookState(TransactionCase):		def setUp(self, *args, **kwargs):		super(TestBookState, self).setUp(*args, **kwargs)		self.test_book = self.env['library.book'].create({'name': 'Book 1'})			def test_button_available(self):		'''Make available button'''		self.test_book.make_available()		self.assertEqual( self.test_book.state,  'available', 'Book state should be changed to available')		def test_button_lost(self):		'''Make lost button'''		self.test_book.make_lost()		self.assertEqual( self.test_book.state, 'lost', 'Book state should be changed to lost')
  1. 运行测试用例
./odoo-bin -c server.conf -i my_library --test-enable

查看运行日志,测试用例信息如下

... INFO test odoo.addons.my_library.tests.test_ book_state: Starting TestBookState.test_button_available ...... INFO test odoo.addons.my_library.tests.test_book_state: Starting TestBookState.test_button_lost ...... INFO test odoo.modules.loading: Module my_library loaded in 0.79s (incl. 0.12s test), 179 queries (+10 test)

如果报错,"INFO"》》"ERROR"。

原理

在odoo中,测试用例添加在tests/目录。odoo将自动识别该目录并运行测试用例。

注意

我们需要在tests/__init__.py文件中添加我们的测试用例。

Odoo中使用了python的unittest包。详细了解见 https://docs.python.org/3.5/library/ unittest.html。odoo通过对unittest的简单封装,实现了多个非常有帮助的类,可用于简化测试用例。在我们的例子中,我们使用了TransactionCase。现在TransactionCase可在单独的食物中执行测试用例。在测试用例执行成功后,将会回滚。意味着,下一个测试用例也将在初始化的环境下执行。

以test_开头的类方法将被认为是测试用例。在我们的例子中,我们添加了两个测试用例。可用于检查图书的状态。self.assertEqual方法可用于检查测试用例是否运行正常。

重要信息

setUp()方法将在每一个测试用例前执行,因此在本节,我们添加了两个测试用例,因此setUp()将调用两次。TransactionCase将负责在每次测试用例执行完后进行回滚。

更多

测试单元中还提供了如下测试类:

  • SingleTransactionCase: 所有的测试用例将在一个事务中执行,因此第一个测试用例中对记录的修改将体现在第二个测试用例中。所有的测试用例执行完成后再进行回滚。
  • SavepointCase: 测试用例将运行在特定的场景下(对记录进行修改后save point,然后测试用例在此基础上进行测试)。这可确保在进行大型的测试时,可快速的生成测试数据。我们可通过setUpClass()类进行生产测试数据。

运行python测试用例

当我们在启动odoo实例时传入--test-enabled,测试用例将在模块完成安装后立刻执行。如果你想在所有的模块完成安装后再执行,或者仅想执行某一个模块的测试用例,可通过tagged()装饰器实现。本章,我们将介绍如何使用该装饰器。

准备

步骤

  1. 添加tagged()装饰器,并在所有模块完成安装后执行
from odoo.tests.common import TransactionCase, tagged@tagged('-at_install', 'post_install')class TestBookState(TransactionCase):···
  1. 运行测试用例
./odoo-bin -c server.conf -i my_library --test-enable
  1. 检查服务日志,显示如下:
... INFO book odoo.modules.loading: 9 modules loaded in 1.87s, 177 queries (+0 extra)... INFO book odoo.modules.loading: Modules loaded.... INFO book odoo.service.server: Starting post tests... INFO book odoo.addons.my_library.tests.test_book_ state: Starting TestBookState.test_button_available ...... INFO book odoo.addons.my_library.tests.test_book_ state: Starting TestBookState.test_button_lost ...... INFO book odoo.service.server: 2 post-tests in 0.14s, 10 queries

如上显示在所有模块完成安装后(post_install)执行测试用例。

原理

默认,测试用例被标记为standard, at_install及模块的名称。因此,如果你并没有使用tagged装饰器,将默认是如上标识。

在我们的案例中,我们希望在安装所有模块之后运行测试用例。为此,我们向TestBookState类添加了一个tagged()装饰器。默认情况下,测试用例具有at_install标记。由于这个标记,您的测试用例将在模块安装后立即运行;它不会等待其他模块被安装。我们不希望这样,所以为了删除at_install标记,我们向标记函数添加了-at_install。以-为前缀的标签将删除该标签。
通过向tagged()函数添加-at_install,我们在模块安装后停止了测试用例的执行。由于我们没有在这里指定任何其他标记,测试用例将不会运行。
因此,我们添加了一个post_install标记。这个标记指定测试用例需要在所有模块安装完成后运行。
如您所见,默认情况下,所有的测试用例都是用标准标记标记的。Odoo将运行所有用标准标签标记的测试用例,以防您不想一直运行特定的测试用例,而只想在被请求时运行测试用例。要做到这一点,你需要通过在tagged()装饰器中添加-standard来移除standard标签,你需要添加一个像这样的自定义标签:

@tagged('-standard', 'my_custom_tag')class TestClass(TransactionCase):···

在使用--test-enable时所有非标的测试用例将不会执行。可通过--test-tags=name执行目标测试用例,如下:

./odoo-bin -c server.conf -i my_library --test-tags=my_custom_ tag

更多

在测试用例的开发过程中,只为一个模块运行测试用例是很重要的。默认情况下,模块的技术名称是作为标记添加的,因此可以使用模块的技术名称和--test-tags选项。例如,如果你想为my_library模块运行测试用例,那么你可以这样运行服务器:

./odoo-bin -c server.conf -i my_library --test-tags=my_library

这里给出的命令将运行my_library模块中测试用例,但是它仍然会根据at_install和post_install选项来决定顺序。

为客户端侧的测试用例配置Headless Chrome

Odoo使用Headless Chrome来执行JavaScript测试用例和tour测试用例。Headless Chrome是一种不需要完整UI就可以运行Chrome的方法。这样,我们就可以在与最终用户相同的环境中运行JavaScript测试用例。在这个食谱中,我们将安装Headless Chrome和其他包来运行JavaScript测试用例。

步骤

您将需要安装Chrome来启用JavaScript测试用例。对于模块的开发,我们主要使用桌面操作系统。因此,如果你的系统上安装了Chrome浏览器,那么就不需要单独安装。您可以使用桌面Chrome运行客户端测试用例。请确保您的Chrome版本高于Chrome 59。Odoo也支持Chromium浏览器。

小贴士

Headless Chrome客户端测试用例在macOS和Linux上运行良好,但Odoo不支持Windows上的Headless Chrome测试用例。

当您想要在生产服务器或服务器操作系统上运行测试用例时,情况会略有变化。服务器操作系统没有GUI,所以你需要安装不同的Chrome。如果你使用的是基于debian的操作系统,你可以使用以下命令安装Chromium:

apt-get install chromium-browser

重要信息

Ubuntu 18.04服务器版默认没有启用universe存储库。因此,有可能安装铬浏览器将显示安装候选错误。要修复此错误,可以使用以下命令启用universe存储库:sudo add-apt-repository universe。

Odoo还支持WebSockets用于JavaScript测试用例。为此,Odoo使用websocket客户端Python库。要安装它,使用以下命令:

pip3 install websocket-client

原理

Odoo使用无头浏览器进行JavaScript测试用例。这背后的原因是它在后台运行测试用例,所以它也可以在服务器操作系统上运行。Headless Chrome更喜欢在后台运行Chrome浏览器,而不需要打开GUI浏览器。Odoo在后台打开一个Chrome标签,并开始运行测试用例。它还使用jQuery的QUnit来进行JavaScript测试用例。在接下来的几个食谱中,我们将为自定义JavaScript小部件创建一个QUnit测试用例。

对于测试用例,Odoo在一个单独的进程中打开了Headless Chrome,所以为了找到在这个进程中运行的测试用例的状态,Odoo服务器使用WebSockets。websocket-client Python库用于管理WebSockets,以便从Odoo服务器与Chrome通信。

添加客户端侧的QUnit测试用例

在Odoo中,创建新的领域或视图是非常简单的。只需几行XML,就可以定义一个新的视图。然而,在底层,它使用了大量的JavaScript。在客户端修改/添加新特性是复杂的,可能会破坏一些东西。大多数客户端问题不会被注意到,因为大多数错误只显示在控制台中。因此,在Odoo中使用QUnit测试用例来检查不同JavaScript组件的正确性。

准备

步骤

按照以下步骤向int_color小部件添加JavaScript测试用例:

  1. 添加/static/tests/colorpicker_tests.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(){            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}                    ]                }            };        }    }, function(){        // 步骤2中内容    });});
  1. 添加QUnit测试用例:
QUnit.only('int_color field test cases', async function (assert) {    assert.expect(2);    var form = await testUtils.createView({        View: FormView,        model: 'book',        data: this.data,        arch: '
' + '
' + '
' + '
' + '
' + '
', res_id: 1, }); await testUtils.form.clickEdit(form); assert.strictEqual(form.$('.o_int_colorpicker .o_ color_pill').length, 10, "colorpicker should have 10 pills"); await testUtils.dom.click(form.$('.o_int_colorpicker .o_color_pill:eq(5)')); assert.strictEqual(form.$('.o_int_colorpicker .o_ color_5').hasClass('active'), true, "click on pill should make pill active"); form.destroy();});
  1. 在/views/template.xml注册测试文件

转载地址:http://ypkbz.baihongyu.com/

你可能感兴趣的文章