當我們開發大型應用的時候,通過自動化測驗可以大幅提高應用的健壯性,每年,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的測驗用例用于測驗業務邏輯的可用性,第五章,“服務器側開發-基礎篇”,我們了解了如何調整現有業務邏輯,由于對現有模型的修改有可能會破壞原有的邏輯,測驗就顯得尤為重要,在本節,我們將創建用于驗證改變圖書狀態的業務邏輯,
準備
步驟
- 添加檔案tests/__init__.py
from . import test_book_state
- 添加tests/test_book_state.py檔案
from odoo.tests.common import TransactionCase
class 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')
- 運行測驗用例
./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()裝飾器實作,本章,我們將介紹如何使用該裝飾器,
準備
步驟
- 添加tagged()裝飾器,并在所有模塊完成安裝后執行
from odoo.tests.common import TransactionCase, tagged
@tagged('-at_install', 'post_install')
class TestBookState(TransactionCase):
···
- 運行測驗用例
./odoo-bin -c server.conf -i my_library --test-enable
- 檢查服務日志,顯示如下:
... 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測驗用例:
- 添加/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 = https://www.cnblogs.com/xushuotec/archive/2021/03/12/{
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中內容
});
});
- 添加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: '<form string="Books">' +
'<group>' +
'<field name="name"/>' +
'<field name="color" widget="int_color"/>' +
'</group>' +
'</form>',
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();
});
- 在/views/template.xml注冊測驗檔案
<template id="qunit_suite" name="colorpicker test" inherit_id="web.qunit_suite">
<xpath expr="." position="inside">
<script type="text/javascript" src="https://www.cnblogs.com/my_library/static/tests/ colorpicker_tests.js" />
</xpath>
</template>
運行測驗用例
./odoo-bin -c server.conf -i my_library,web --test-enable
檢查日志
... INFO test odoo.addons.web.tests.test_js.WebSuite: console log: "Color Picker Tests" passed 2 tests.
原理
在odoo中,JavaScript測驗用例添加在/static/tests目錄中,步驟1,我們新增了colorpicker_tests.js檔案,我們引入了formView及test_utils,因為我們創建的ini_color小部件是作用于form視圖的,因此我們還需要引入web.FormView,
web.test_utils為我們提供了構建js測驗用例的物體,如果你不了解js的引入機制,可參考第十四章"擴展CSS及JavaScript",
odoo的客戶端測驗用例是通過QUit框架實作了,它是用于JS單元測驗的JQuery框架,參考https://qunitjs.com/,beforeEach函式會運行測驗用例前執行,可用于初始化測驗資料,函式由QUit框架提供,
我們在beforeEach函式中初始化了一些資料,客戶端測驗用例是運行在一個獨立(mock)的環境中,它并不與資料庫進行互動,因此,我們需要創建一些測驗資料,在內部,odoo創建了虛擬環境模擬RPC,this.data模式資料庫,this.data中的keys相當于資料庫中表,values相當于表中的欄位及行,在我們的例子中,我們添加了book的表,book表有兩個欄位name(char)及color(integer),在這,我們可以使用所有的欄位型別,比如,{string:"M2oField", type:"many2one", relation:"partner"},我們在records中添加了兩條記錄,
下一步,我們借助Quit.test函式創建了測驗用例,函式的第一個引數是string型別,用于描述測驗用例的用途,第二個引數是具體測驗用例代碼邏輯的函式,函式由QUnit框架呼叫,assert實體作為引數傳遞到函式體內,在我們的例子中,我們在assert.expect函式中傳入了測驗用例的個數,我們一共有兩個測驗用例,因此我們傳入2,
我們計劃測驗編輯模式下的int_color小部件,所以我們通過testUtils.createView創建了編輯模式下的form視圖,createView接收不同引數:
- View: 我們創建的視圖,
- model: 視圖作用于的模型的名稱,
- data: 模擬資料,
- arch: 視圖的定義內容,
- res_id: 展示的記錄的ID,該選項作用于form視圖,在我們的案例中,form視圖展示book 1的資料,因為res_id為1,
在使用int_color小部件創建表單視圖之后,我們添加了兩個測驗用例,第一個測驗用例用于檢查UI上彩色藥片的數量,第二個測驗用例用于檢查藥片在單擊后是否被正確激活,我們從斷言的QUnit框架的效用中得到了嚴格的函式,如果前兩個引數匹配,則strictEqual函式通過測驗用例,如果它們不匹配,則測驗用例將失敗,
更多
還有一些assert函式可以用于QUnit測驗用例,比如assert.deepEqual,assert.ok,assert.notOk,要了解有關QUnit的更多資訊,請參閱https://qunitjs.com/上的檔案,
添加向導的測驗用例
現在您已經看到了Python和JavaScript測驗用例,它們都在一個孤立的環境中作業,它們彼此之間不相互作用,為了測驗JavaScript和Python代碼之間的集成,使用了向導測驗用例,
準備
對于本節,我們將繼續使用上一節中的my_library模塊,我們將添加一個巡回測驗用例來檢查圖書模型的流程,另外,確保您已經安裝了web_tour模塊,或者已經將web_tour模塊依賴項添加到清單中,
步驟
按照以下步驟添加圖書的向導測驗用例:
- 添加一個/static/src/js/my_library_tour.js檔案:
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",
test: true,
rainbowManMessage: _t("Congrats, you have listed a book."),
sequence: 5,
}, [tour.stepUtils.showAppsMenuItem(), // Place step 3 here
]);
});
- 添加測驗步驟
{
trigger: '.o_app[data-menu-xmlid="my_library.library_ base_menu"]',
content: _t('Manage books and authors in <b>Library app</b>.'),
position: 'right'
}, {
trigger: '.o_list_button_add',
content: _t("Let's create new book."),
position: 'bottom',
}, {
trigger: 'input[name="name"]',
extra_trigger: '.o_form_editable',
content: _t('Set the book title'),
position: 'right',
run: function (actions) {
actions.text('Test Book');
},
}, {
trigger: '.o_form_button_save',
content: _t('Save this book record'),
position: 'bottom',
}
- 添加到test資源
<template id="assets_tests" name="Library Assets Tests" inherit_id="web.assets_tests">
<xpath expr="." position="inside">
<script type="text/javascript" src="https://www.cnblogs.com/my_library/ static/tests/my_library_tour.js" />
</xpath>
</template>
- 添加一個/tests/test_tour.py檔案,通過HttpCase運行tour,如下所示:
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")
運行測驗用例
./odoo-bin -c server.conf -i my_library --test-enable
運行日志如下:
...INFO test odoo.addons.my_library.tests.test_tour.TestBookUI: console log: Tour library_tour succeeded
原理
為了創建tour測驗用例,您需要首先創建UI tour,如果你想了解更多關于UI tours的資訊,請參考第15章“Web客戶端開發”中的通過向導提升互動感一節,
步驟1,我們用library_tour注冊了一個新的tour,
步驟2,我們為向導測驗用例添加了步驟,
與之前的向導案例相比,這里有兩個主要變化,首先,我們為向導定義添加了一個test=true引數;其次,我們添加了一個額外的屬性,run,在run函式中,您必須撰寫邏輯來執行通常由用戶執行的操作,例如,在向導的第四步中,我們要求用戶輸入書名,
為了自動化這個步驟,我們添加了一個run函式來設定title欄位中的值,run函式將操作實用程式作為引數傳遞,這提供了一些執行基本操作的快捷方式,最重要的問題如下:
- actions.click(element): 點擊元素
- actions.dblclick(element): 雙擊元素
- actions.tripleclick(element): 三擊元素
- actions.text(string): 設定input的值
- actions.drag_and_drop(to, element):拖放元素
- actions.keydown(keyCodes, element): 在元素上觸發特定的按鍵事件
- actions.auto(): 默認動作,當在tour步驟中沒有傳遞run函式時,將執行actions.auto(),這通常會單擊步驟中觸發的元素,這里唯一的例外是輸入元素,如果觸發的是input,那么tour將在輸入中設定默認值Test,這就是為什么我們不需要向所有步驟添加run函式,
另外,如果默認操作不夠,您也可以手動執行整個操作,在下一個步驟中,我們想要為顏色選擇器設定一個值,注意,我們使用的是手動操作,因為默認值在這里不起作用,因此,我們使用基本的jQuery代碼添加了run方法來單擊顏色選擇器的第三個顏色圓點,在這里,可通過this.$archor屬性獲取需觸發的元素,
默認情況下,注冊的向導將提高終端用戶的互動體驗,為了測驗它們,你需要在Headless Chrome中運行它們,為此,您需要使用HttpCase觸發測驗用例,這提供了browser_ js方法,該方法打開URL并執行作為第二個引數傳遞的命令,如下所示:
odoo.__DEBUG__.services['web_tour.tour'].run('library_tour')
在我們的示例中,向導測驗用例的名稱將作為browser_js的第一個引數,隨后的引數待執行的測驗用用例,最后一個引數是執行測驗用例用戶名,
運行客戶端側的測驗用用例
odoo提供了通過UI運行客戶端測驗用例的方法,我們可以看到測驗用例每一步的執行情況,
步驟
我們可以通過UI運行QUit和向導測驗用例,我們可以激活開發者模式,查看通過UI執行的選項,
通過UI運行QUit測驗用例
點擊BUG圖示,選擇Run JS Tests,如下:

這會打開QUit實體,并逐個運行測驗用例,如下圖,默認,僅展示測驗失敗的用例,如果想顯示所有的測驗用例,取消Hide passed tests選項,

通過UI運行向導測驗
點擊BUG圖示,選擇Start Tour,如下:

將展示向導測驗用例的串列,我們可點擊后面的start啟動相應的測驗用例:

如果您啟用了測驗資產模式,那么測驗之旅只會顯示在串列中,如果在串列中沒有找到library_tour,請確保已激活測驗資產模式,
原理
QUnit的UI是由QUnit框架本身提供的,在這里,您可以為模塊篩選測驗用例,您甚至可以為一個模塊運行一個測驗用例,通過UI,您可以看到每個測驗用例的進度,并且可以深入到測驗用例的每個步驟,在內部,Odoo只是在Headless Chrome打開相同的URL,
點擊Run tours選項將顯示可用的tours串列,通過點擊串列上的播放按鈕,您可以運行向導測驗用例,注意,當向導通過命令列選項運行時,它將在回滾事務中運行,因此在向導成功后,通過向導所做的更改將被回滾,但是,當tour從UI運行時,它的作業方式就像用戶正在操作它一樣,這意味著tour所做的更改不會回滾并停留在那里,所以要小心使用這個選項,
除錯測驗端側的測驗用例
開發復雜的客戶端測驗用例是件非常頭痛的事,本節,我們將學習如何除錯客戶端測驗用例,如何運行其中一個測驗用例,
準備
步驟
- 用QUit.onlg替換/static/tests/colorpicker_tests.js中的QUit.test測驗方法:
QUnit.only('int_color field test cases', function (assert) {
- 在createView中添加debug引數如下:
var form = testUtils.createView({
View: FormView,
model: 'book',
data: this.data,
arch: '<form string="Books">' +
'<group>' +
'<field name="name"/>' +
'<field name="color" widget="int_color"/>' +
'</group>' +
'</form>',
res_id: 1,
debug:true
});
點擊 Run JS Tests:

原理
步驟1,我們用QUnit.only替換了QUnit.test,這將只運行這個測驗用例,在測驗用例的開發程序中,這可以節省時間,注意,使用QUnit.only將會終止通過命令列選項運行的測驗用例,這只能用于除錯或測驗,并且只能在從UI打開測驗用例時使用,所以不要忘記在開發完成后將其替換為QUnit.test,
在我們的QUnit測驗用例示例中,我們創建了表單視圖來測驗int_ color小部件,如果您在UI中運行QUnit測驗用例,您將了解到您不能在UI中看到創建的表單視圖,在QUnit套件的UI中,您只能看到日志,這使得開發QUnit測驗用例非常困難,為了解決這個問題,在createView函式中使用了debug引數,在步驟2中,我們在createView函式中添加了debug: true,這將在瀏覽器中顯示test form視圖,在這里,您可以通過瀏覽器除錯器定位檔案物件模型(Document Object Model, DOM)元素,
警告
在測驗用例的最后,我們通過destroy()方法銷毀視圖,如果您已經銷毀了視圖,那么您將無法在UI中看到表單視圖,因此為了在瀏覽器中看到它,請在開發期間洗掉這一行,這將幫助您除錯測驗用例,
為失敗的測驗用例生成視頻或螢屏截圖
Odoo使用headless CHrome,這開啟了新的可能性,從Odoo 12開始,您可以錄制失敗的測驗用例的視頻,也可以對失敗的測驗用例進行截屏,
步驟
為測驗用例錄制視頻需要一個ffmpeg包,
- 安裝包
apt-get install ffmpeg
- 要生成視頻或螢屏截圖,您需要提供一個目錄位置來存盤視頻或螢屏截圖,
- 如果你想生成一個測驗用例的截屏(視頻),使用——截屏命令,如下:
./odoo-bin -c server.conf -i my_library --test-enable --screencasts=/home/pga/odoo_test/
- 如果你想生成一個測驗用例的截圖,使用——screenshosts命令,如下:
./odoo-bin -c server.conf -i my_library --test-enable --screenshots=/home/pga/odoo_test/
原理
為了為失敗的測驗案例生成截屏/截屏,您需要使用保存視頻或影像檔案的路徑運行服務器,當您運行測驗用例時,如果測驗用例失敗了,Odoo將在給定目錄中保存失敗測驗用例的截圖/視頻,
為了生成測驗用例的視頻,Odoo使用了ffmpeg包,如果您沒有在服務器上安裝這個包,那么它將只保存一個失敗的測驗用例的截圖,在安裝這個包之后,您將能夠看到任何失敗的測驗用例的mp4檔案,
小貼士
為測驗用例生成視頻會占用磁盤上更多的空間,所以請謹慎使用此選項,并且只在確實需要時使用,
請記住,螢屏截圖和視頻只會為失敗的測驗用例生成,所以如果您想要測驗它們,您需要撰寫一個失敗的測驗用例,
為測驗填充隨機資料
到目前為止,我們已經看到了用于檢測業務邏輯中的錯誤或bug的測驗用例,然而,有時我們需要用大量的資料來測驗我們的開發,生成大量資料可能是一項乏味的作業,Odoo提供了一套工具,可以幫助您為模型生成大量隨機資料,在本節,我們將使用populate命令為library.book模型生成測驗資料,
準備
對于本節,我們將繼續使用上一節的my_library模塊,我們將添加_populate_factories方法,它將用于生成測驗資料,
步驟
- 在my_library模塊中添加populate檔案夾,添加__init__.py檔案,
from . import library_data
- 添加my_library/populate/library_data.py檔案:
from odoo import models
from odoo.tools import populate
class BookData(models.Model):
_inherit = "library.book"
_populate_sizes = {"small": 10, "medium": 100, "large": 500}
def _populate_factories(self):
return [
("name", populate.constant("Book no {counter}")),
]
- 運行命令
./odoo-bin populate -–models=library.book –-size=medium -c server.conf -i my_library
這將為圖書生成100個單位的資料,生成資料后,流程將被終止,要查看該書的資料,運行不帶填充引數的命令,
原理
步驟1,新增生成資料檔案目錄,
步驟2,添加生成資料代碼,使用populate_factories生成隨機資料,_populate_factories方法回傳模型欄位的工廠,這些工廠將用于生成隨機資料,模型具有必需的name欄位,因此在我們的示例中,我們回傳了name欄位的生成器,這個生成器將用于為圖書記錄生成隨機資料,我們已經使用了populate.constant;當我們在資料生成程序中進行迭代時,這將生成不同的名稱,
除了populate.constant,Odoo提供了其他幾個生成器來填充資料,如下:
- populate.randomize(list):從給定的串列回傳隨機元素
- populate.cartesian(list): 與randomize類似,但盡可能保所串列中所有的內容,
- populate.constant(str): 用于生成格式化字串,還可以傳遞formatter引數來格式化值,默認情況下,格式化程式是一個字串格式函式,
- populate.compute(function): 當您想要根據您的函式計算一個值時使用,
- populate.randint(a, b): 用于在a和b引數之間生成一個亂數,
另一個重要的屬性是_populate_sizes,基于--size引數,表示想要生成的資料的數量,
步驟3,我們生成了圖書的模型,為了生成測驗資料,我們需要使用--size和--model引數,odoo將使用_populate方法生成隨機記錄,_populate方法呼叫_populate_factories方法生成隨機資料,
小貼士
如果多次運行populate命令,資料也將生成多次,小心使用這一點非常重要:如果在生產資料庫中運行該命令,它將在生產資料庫中生成測驗資料,這是你要避免的,
更多
有時,您也希望生成關系資料,例如,對于書籍,您可能還希望創建作者或租借記錄,要管理這樣的記錄,可以使用_populate_dependencies屬性:
class BookData(models.Model):
_inherit = 'library.book'
_populate_sizes = {'small': 10, 'medium': 100, 'large': 500}
_populate_dependencies = ['res.users', 'res.company']
這將在填充當前模型之前填充依賴項資料,一旦完成,你可以通過populated_models注冊表訪問已填充的資料:
company_ids = self.env.registry.populated_models['res.company']
這里給出的行將為您提供在為當前模型生成測驗資料之前填充的公司串列,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/270826.html
標籤:其他
