主頁 > 企業開發 > 【odoo14】第十八章、自動化測驗

【odoo14】第十八章、自動化測驗

2021-04-01 20:07:04 企業開發

當我們開發大型應用的時候,通過自動化測驗可以大幅提高應用的健壯性,每年,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 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')
  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 = https://www.cnblogs.com/xushuotec/p/{
                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: '<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();
});
  1. 在/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模塊依賴項添加到清單中,

步驟

按照以下步驟添加圖書的向導測驗用例:

  1. 添加一個/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
    ]);
});
  1. 添加測驗步驟
{
    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',
}
  1. 添加到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>
  1. 添加一個/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所做的更改不會回滾并停留在那里,所以要小心使用這個選項,

除錯測驗端側的測驗用例

開發復雜的客戶端測驗用例是件非常頭痛的事,本節,我們將學習如何除錯客戶端測驗用例,如何運行其中一個測驗用例,

準備

步驟

  1. 用QUit.onlg替換/static/tests/colorpicker_tests.js中的QUit.test測驗方法:
QUnit.only('int_color field test cases', function (assert) {
  1. 在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包,

  1. 安裝包
apt-get install ffmpeg
  1. 要生成視頻或螢屏截圖,您需要提供一個目錄位置來存盤視頻或螢屏截圖,
  2. 如果你想生成一個測驗用例的截屏(視頻),使用——截屏命令,如下:
./odoo-bin -c server.conf -i my_library --test-enable --screencasts=/home/pga/odoo_test/
  1. 如果你想生成一個測驗用例的截圖,使用——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方法,它將用于生成測驗資料,

步驟

  1. 在my_library模塊中添加populate檔案夾,添加__init__.py檔案,
from . import library_data
  1. 添加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}")),
        ]
  1. 運行命令
./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/270817.html

標籤:其他

上一篇:開源大屏工具 DataGear 的使用

下一篇:【odoo14】第二十章、odoo的遠程程序呼叫

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • IEEE1588PTP在數字化變電站時鐘同步方面的應用

    IEEE1588ptp在數字化變電站時鐘同步方面的應用 京準電子科技官微——ahjzsz 一、電力系統時間同步基本概況 隨著對IEC 61850標準研究的不斷深入,國內外學者提出基于IEC61850通信標準體系建設數字化變電站的發展思路。數字化變電站與常規變電站的顯著區別在于程序層傳統的電流/電壓互 ......

    uj5u.com 2020-09-10 03:51:52 more
  • HTTP request smuggling CL.TE

    CL.TE 簡介 前端通過Content-Length處理請求,通過反向代理或者負載均衡將請求轉發到后端,后端Transfer-Encoding優先級較高,以TE處理請求造成安全問題。 檢測 發送如下資料包 POST / HTTP/1.1 Host: ac391f7e1e9af821806e890 ......

    uj5u.com 2020-09-10 03:52:11 more
  • 網路滲透資料大全單——漏洞庫篇

    網路滲透資料大全單——漏洞庫篇漏洞庫 NVD ——美國國家漏洞庫 →http://nvd.nist.gov/。 CERT ——美國國家應急回應中心 →https://www.us-cert.gov/ OSVDB ——開源漏洞庫 →http://osvdb.org Bugtraq ——賽門鐵克 →ht ......

    uj5u.com 2020-09-10 03:52:15 more
  • 京準講述NTP時鐘服務器應用及原理

    京準講述NTP時鐘服務器應用及原理京準講述NTP時鐘服務器應用及原理 安徽京準電子科技官微——ahjzsz 北斗授時原理 授時是指接識訓通過某種方式獲得本地時間與北斗標準時間的鐘差,然后調整本地時鐘使時差控制在一定的精度范圍內。 衛星導航系統通常由三部分組成:導航授時衛星、地面檢測校正維護系統和用戶 ......

    uj5u.com 2020-09-10 03:52:25 more
  • 利用北斗衛星系統設計NTP網路時間服務器

    利用北斗衛星系統設計NTP網路時間服務器 利用北斗衛星系統設計NTP網路時間服務器 安徽京準電子科技官微——ahjzsz 概述 NTP網路時間服務器是一款支持NTP和SNTP網路時間同步協議,高精度、大容量、高品質的高科技時鐘產品。 NTP網路時間服務器設備采用冗余架構設計,高精度時鐘直接來源于北斗 ......

    uj5u.com 2020-09-10 03:52:35 more
  • 詳細解讀電力系統各種對時方式

    詳細解讀電力系統各種對時方式 詳細解讀電力系統各種對時方式 安徽京準電子科技官微——ahjzsz,更多資料請添加VX 衛星同步時鐘是我京準公司開發研制的應用衛星授時時技術的標準時間顯示和發送的裝置,該裝置以M國全球定位系統(GLOBAL POSITIONING SYSTEM,縮寫為GPS)或者我國北 ......

    uj5u.com 2020-09-10 03:52:45 more
  • 如何保證外包團隊接入企業內網安全

    不管企業規模的大小,只要企業想省錢,那么企業的某些服務就一定會采用外包的形式,然而看似美好又經濟的策略,其實也有不好的一面。下面我通過安全的角度來聊聊使用外包團的安全隱患問題。 先看看什么服務會使用外包的,最常見的就是話務/客服這種需要大量重復性、無技術性的服務,或者是一些銷售外包、特殊的職能外包等 ......

    uj5u.com 2020-09-10 03:52:57 more
  • PHP漏洞之【整型數字型SQL注入】

    0x01 什么是SQL注入 SQL是一種注入攻擊,通過前端帶入后端資料庫進行惡意的SQL陳述句查詢。 0x02 SQL整型注入原理 SQL注入一般發生在動態網站URL地址里,當然也會發生在其它地發,如登錄框等等也會存在注入,只要是和資料庫打交道的地方都有可能存在。 如這里http://192.168. ......

    uj5u.com 2020-09-10 03:55:40 more
  • [GXYCTF2019]禁止套娃

    git泄露獲取原始碼 使用GET傳參,引數為exp 經過三層過濾執行 第一層過濾偽協議,第二層過濾帶引數的函式,第三層過濾一些函式 preg_replace('/[a-z,_]+\((?R)?\)/', NULL, $_GET['exp'] (?R)參考當前正則運算式,相當于匹配函式里的引數 因此傳遞 ......

    uj5u.com 2020-09-10 03:56:07 more
  • 等保2.0實施流程

    流程 結論 ......

    uj5u.com 2020-09-10 03:56:16 more
最新发布
  • 使用Django Rest framework搭建Blog

    在前面的Blog例子中我們使用的是GraphQL, 雖然GraphQL的使用處于上升趨勢,但是Rest API還是使用的更廣泛一些. 所以還是決定回到傳統的rest api framework上來, Django rest framework的官網上給了一個很好用的QuickStart, 我參考Qu ......

    uj5u.com 2023-04-20 08:17:54 more
  • 記錄-new Date() 我忍你很久了!

    這里給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 大家平時在開發的時候有沒被new Date()折磨過?就是它的諸多怪異的設定讓你每每用的時候,都可能不小心踩坑。造成程式意外出錯,卻一下子找不到問題出處,那叫一個煩透了…… 下面,我就列舉它的“四宗罪”及應用思考 可惡的四宗罪 1. Sa ......

    uj5u.com 2023-04-20 08:17:47 more
  • 使用Vue.js實作文字跑馬燈效果

    實作文字跑馬燈效果,首先用到 substring()截取 和 setInterval計時器 clearInterval()清除計時器 效果如下: 實作代碼如下: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta ......

    uj5u.com 2023-04-20 08:12:31 more
  • JavaScript 運算子

    JavaScript 運算子/運算子 在 JavaScript 中,有一些運算子可以使代碼更簡潔、易讀和高效。以下是一些常見的運算子: 1、可選鏈運算子(optional chaining operator) ?.是可選鏈運算子(optional chaining operator)。?. 可選鏈操 ......

    uj5u.com 2023-04-20 08:02:25 more
  • CSS—相對單位rem

    一、概述 rem是一個相對長度單位,它的單位長度取決于根標簽html的字體尺寸。rem即root em的意思,中文翻譯為根em。瀏覽器的文本尺寸一般默認為16px,即默認情況下: 1rem = 16px rem布局原理:根據CSS媒體查詢功能,更改根標簽的字體尺寸,實作rem單位隨螢屏尺寸的變化,如 ......

    uj5u.com 2023-04-20 08:02:21 more
  • 我的第一個NPM包:panghu-planebattle-esm(胖虎飛機大戰)使用說明

    好家伙,我的包終于開發完啦 歡迎使用胖虎的飛機大戰包!! 為你的主頁添加色彩 這是一個有趣的網頁小游戲包,使用canvas和js開發 使用ES6模塊化開發 效果圖如下: (覺得圖片太sb的可以自己改) 代碼已開源!! Git: https://gitee.com/tang-and-han-dynas ......

    uj5u.com 2023-04-20 08:01:50 more
  • 如何在 vue3 中使用 jsx/tsx?

    我們都知道,通常情況下我們使用 vue 大多都是用的 SFC(Signle File Component)單檔案組件模式,即一個組件就是一個檔案,但其實 Vue 也是支持使用 JSX 來撰寫組件的。這里不討論 SFC 和 JSX 的好壞,這個仁者見仁智者見智。本篇文章旨在帶領大家快速了解和使用 Vu ......

    uj5u.com 2023-04-20 08:01:37 more
  • 【Vue2.x原始碼系列06】計算屬性computed原理

    本章目標:計算屬性是如何實作的?計算屬性快取原理以及洋蔥模型的應用?在初始化Vue實體時,我們會給每個計算屬性都創建一個對應watcher,我們稱之為計算屬性watcher ......

    uj5u.com 2023-04-20 08:01:31 more
  • http1.1與http2.0

    一、http是什么 通俗來講,http就是計算機通過網路進行通信的規則,是一個基于請求與回應,無狀態的,應用層協議。常用于TCP/IP協議傳輸資料。目前任何終端之間任何一種通信方式都必須按Http協議進行,否則無法連接。tcp(三次握手,四次揮手)。 請求與回應:客戶端請求、服務端回應資料。 無狀態 ......

    uj5u.com 2023-04-20 08:01:10 more
  • http1.1與http2.0

    一、http是什么 通俗來講,http就是計算機通過網路進行通信的規則,是一個基于請求與回應,無狀態的,應用層協議。常用于TCP/IP協議傳輸資料。目前任何終端之間任何一種通信方式都必須按Http協議進行,否則無法連接。tcp(三次握手,四次揮手)。 請求與回應:客戶端請求、服務端回應資料。 無狀態 ......

    uj5u.com 2023-04-20 08:00:32 more