主頁 > 軟體設計 > 搭配實戰細講Pytest--為后續UI測驗封裝打基礎--值得收藏

搭配實戰細講Pytest--為后續UI測驗封裝打基礎--值得收藏

2021-09-28 13:49:14 軟體設計

pytest是一個非常好用的測驗框架,并且這個框架已經非常成熟了,

它簡單靈活,容易上手,支持引數化,也能夠支持簡單的單元測驗和復雜的功能測驗,也是自動化測驗的利器,

我們先來看看如何安裝:在Python環境沒問題的情況下直接pip install pytest即可,進入正題

目錄

命令列引數

vs

maxfail

xdist

reruns

測驗報告

allure

mark標簽

前置后置

fixture

引數化

命名

擴展


命令列引數

vs

先來看一個比較簡單的示例,我們直接從示例入手:

import pytest

def test_01():
    print("第一條用例")

class Testcase:
    def test_02(self):
        print("第二條測驗用例")

注意看我的類名,首字母大寫的!!!這里實際上是不會在控制臺輸出我們的列印資訊的,所以我們還需要改改:

import pytest

def test_01():
    print("第一條用例")

class Testcase:
    def test_02(self):
        print("第二條測驗用例")

if __name__ == '__main__':
    pytest.main(["-s","-v","running.py"])

-s是顯示列印資訊,-v顯示詳細的測驗結果,這里你也可以寫到一起去,也就是:

if __name__ == '__main__':
    pytest.main(["running.py","-vs"])

除了寫main方法可以輸出結果之外,我們開始控制臺直接碼命令,

可能你會遇到no tests ran in 0.01s這樣的情況,這種情況一般都是目錄下找不到執行檔案,這時候你就需要cd 切換到檔案所在的檔案目錄就好了,執行命令也是大同小異,

pytest running.py -vs


maxfail

當maxfail=1的時候,用例里面出現一個錯誤用例停止運行

接下來我們多寫幾個用例:

def test_01():
    print("第一條用例")
    assert 0 > 1

def test_04():
    print("清安無別事")

class Testcase:
    def test_02(self):
        print("第二條測驗用例")

    def test_03(self):
        print("第三條用例")

我是在控制臺碼命令的,所以這里我就不寫main方法去跑了,

pytest running.py -vs --maxfail=1


xdist

pip install --xdist

多執行緒,在用例少的情況下看不出太大的區別,多執行緒要比單執行緒少節省將近一半的時間,也就是說當xdist 為2時,啟用兩個執行緒,比直接pytest跑節省近一半時間,

def test_01():
    print("第一條用例")

def test_04():
    print("清安無別事")

class Testcase:
    def test_02(self):
        print("第二條測驗用例")

    def test_03(self):
        print("第三條用例")

pytest running.py -vs --maxfail=1 -n 2,這里xdist有縮寫,也就是-n,后面的2就是2個執行緒的意思,注意看下方截圖的紅色框框的位置,就是執行緒的名字,

reruns

pip install pytest-rerunfailures

重試運行,當運行出現錯誤的時候,也就是非預期結果的時候我們可以再次運行一次該用例

reruns為2時,重新運行兩次

def test_01():
    print("第一條用例")
    assert 0>1

def test_04():
    print("清安無別事")

class Testcase:
    def test_02(self):
        print("第二條測驗用例")

    def test_03(self):
        print("第三條用例")

pytest running.py -vs - n 2 --reruns 2,看下方的截圖,重復運行的兩次,

測驗報告

pytest框架自帶了一個測驗報告生成器,--html=路徑/名稱.html

def test_01():
    print("第一條用例")
    assert 0>1

def test_04():
    print("清安無別事")

class Testcase:
    def test_02(self):
        print("第二條測驗用例")

    def test_03(self):
        print("第三條用例")

如果我想將這四個用例生成測驗報告:

pytest running.py -vs - n 2 --reruns 2 --html=report/report.html

在report檔案夾下生成一個report.html報告,這個報告雖然很一般 ,也是不錯了,當然我們也可以生成allure測驗報告,美觀一些,


allure

pip install allure-pytest下載好庫,

pytest running.py -vs --alluredir ../report/xmll

allure generate --clean ../report/xmll -o ./result/html

仔細看你就會發現其實--clean后面接的是運行代碼時-o后面的路徑,因為運行pytest running.py -vs --alluredir ../report/xmll后,檔案下會自行創建一個report檔案,用例運行資訊會存在xmll里面,我們生成報告就需要呼叫里面的資訊,

因為我是控制臺輸出的所以需要這兩行代碼,輸出完后就可以在result檔案下看到一個index.html檔案,就是測驗報告了,如下圖所示:

mark標簽

什么是mark標簽?mark標簽分為內置標簽與外置標簽,可以用來對用例進行管理運行,我們直接看看例子:

def test002():
    print('這是一條最優級別的用例')

def test005():
    print("skip_reason")

def test003():
    print('這是一條嚴重級別的用例')

def test006():
    print("006冒煙")

def test004():
    print('這是一條較嚴重級別的用例')

上述例子的情況下,與正常情況下無異,這里需要注意:

pytest與unittest不一樣,我test序列號寫的很亂,如果是在unittest中的話肯定就是按數字的順序來執行了,pytest中不分先后,05在04用例的前面,那么就得按這順序來,先運行05用例再04用例,

那么我們給這里加上mark標簽看看:

def test002():
    print('這是一條最優級別的用例')

def test005():
    print("005冒煙")

@pytest.mark.qingan
def test003():
    print('這是一條嚴重級別的用例')

def test006():
    print("006冒煙")

@pytest.mark.qinganan
def test004():
    print('這是一條較嚴重級別的用例')

猜猜這里運行幾條用例?3條,沒錯,

注意:這里mark標簽是外置標簽,我自己命名的,看看運行結果:

pytest -m qingan test_speack.py -sv這里指定外置標簽的標簽名,不指定就會運行全部的用例,不指定怎么對用例進行管理,

這里還是可以看到只執行了兩條,也就是標簽的那兩條用例,這里對指定用例進行標記運行,

mark標簽會受外界的裝飾器影響嗎?我們來看看,

def func(function):
    def fn(*args,**kwargs):
        print("this is "+function.__name__)
        return function(*args,**kwargs)
    return fn
# ----------上面是自己寫的裝飾器--------------
@func
def test002():
    print('這是一條最優級別的用例')

# @pytest.mark.skip
def test005():
    print("skip_reason")

@pytest.mark.qingan
@func
def test003():
    print('這是一條嚴重級別的用例')

def test006():
    print("006冒煙")

@pytest.mark.qingan
@func
def test004():
    print('這是一條較嚴重級別的用例')

是不會的,也是遵循pytest強大的執行順序來的,

那么看了自定義標簽,看看內置標簽吧:

def func(function):
    def fn(*args,**kwargs):
        print("this is "+function.__name__)
        return function(*args,**kwargs)
    return fn
# ----------上面是自己寫的裝飾器--------------
@func
def test002():
    print('這是一條最優級別的用例')

@pytest.mark.skip
def test005():
    print("skip_reason")

@pytest.mark.qingan
@func
def test003():
    print('這是一條嚴重級別的用例')

def test006():
    print("006冒煙")

@pytest.mark.qingan
@func
def test004():
    print('這是一條較嚴重級別的用例')

我在05用例處添加了一個內置標簽,這里需要注意的是,執行命令不一樣:

pytest test_speack.py -s -rs或者pytest -k qingan test_speack.py -sv

05被跳過了,我們可以更改內置標簽的提示資訊

@pytest.mark.skip(reason='不運行')
def test005():
    print("skip_reason")

控制臺就會有這樣的一條資訊可以看到,

這里可以看到自定義標簽與內置標簽處用的運行命令有所不同,不同之處在于一個用了-m一個用了-k,

使用-m的時候我們需要指定自定義標簽,才能跑用例,否則跑不起來,如果用-k即使不指定也是可以跑起來,這樣的一個好處,相信不說你也知道了,控制用例執行,可以更好的執行你想執行的用例,更好的是用于冒煙測驗,

另外還有一個也就是內置標簽判斷,skipif,這是一個怎么樣的標簽呢?

看skip后面帶的if就知道了,可以做一個判斷!條件為真則跳過運行,條件為假則運行用例,

@func
def test002():
    print('這是一條最優級別的用例')

@pytest.mark.skipif(1>2,reason='不運行')
def test005():
    print("skip_reason")

@pytest.mark.qingan
@func
def test003():
    print('這是一條嚴重級別的用例')

def test006():
    print("006冒煙")

@pytest.mark.qingan
@func
def test004():
    print('這是一條較嚴重級別的用例')

pytest -k test_speack.py -sv我在用例005處寫了一個skipif的判斷,1>2是FALSE,所以此處不跳過,

所以此處為真的條件就不舉例了,此處直接告訴各位答案了,


前置后置

在unittest你肯定看到過setup這一類的函式,看下面的例子

class Testcasse():

    """前置后置"""
    def setup(self):
        print("1每個用例的前置")

    def teardown(self):
        print("2每個用例的后置")

    def setup_class(self):
        print("3所有用例的前置")

    def teardown_class(self):
        print("4所有用例的后置")

    def test_004(self):
        print("004")

    def test_005(self):
        print("005")

其中的順序是怎么樣的呢,是否跟之前說的全部無優先級呢?運行一下就知道了,

這里就很明顯了,優先級是3124,這里別誤會,我在print里面加了數字,說一 這里就這樣簡寫了,下面兩個用例004,005是用于分辨的,不然運行不起來,各位可以自己跑一跑,這與pytest本身的規則有關系,


fixture

這里很容易弄錯寫成fixtrue,所以需要注意一些,怎么用呢?fixture可以實作我們在pytest的用例中調傭其他函式,可以發現我們使用fixture是在被呼叫函式之上添加我們的fixture,看例子:

@pytest.fixture
def login():
    print("login")
    return "運行用例"

def test_seacher():
    print(login)    # 回傳的是一個地址
    print(f"搜索用戶名{login}")

def test_seacher1(login):
    print(login)
    print(f"搜索用戶名{login}")

pytest text_fixtrue.py -sv運行起來看看效果:

這樣看就不難理解了,這是一種簡單的距離,看起來像是呼叫,

fixture區別于unnitest的傳統單元測驗(setup/teardown)有顯著改進,

fixture里面有個scope引數可以控制fixture的作用范圍:session>module>class>function
-function:每一個函式或方法都會呼叫
-class:每一個類呼叫一次,一個類中可以有多個方法
-module:每一個.py檔案呼叫一次,該檔案內又有多個function和class
-session:是多個檔案呼叫一次,可以跨.py檔案呼叫,每個.py檔案就是module

這里就需要用到了conftest.py配置了,可以實作資料共享,比如py跨檔案共享前置,另外需要注意的是conftest.py腳本名稱是固定的,不更改名稱,pytest會自動尋找這個檔案,

如果此檔案放到專案的根目錄下就可以全域呼叫了,如果放到某個package下,那就在改package內有效,

在根目錄下這是conftest下的內容:

@pytest.fixture(scope='function')
def openbrowser():
    print("打開瀏覽器")

@pytest.fixture(scope='session')
def qingan():
    print("我是清安")

這是某個檔案內的demo下的內容,主要看Testcase中的內容:

@pytest.fixture(scope='session')
def login():
    print("登錄方法")
    # return "瀏覽器"
    # 此處當scope等于function時,yield可以作用于全域
    yield "類似于teardown,用法可以跟return一樣"

def testSQL(login):
    print("鏈接資料庫")
    print(login)
    return "資料庫連接結果"


@pytest.fixture()
def test01(login):
    print("用例1")

class Testcase():
    def test02(self,openbrowser):
        print("用例2")

    def test03(self,qingan):
        print("用例3")

我呼叫了conftest下的function跟session引數方法,

這里可以看到,都被呼叫了,當然方法不唯一,用法不唯一,這里做這么一個簡單的介紹,主要看各位怎么個用法,module也可以這樣寫,

接下來我們來看看實際的示例,我打開瀏覽器:demo.py檔案

from selenium import webdriver
# 這里每次都需要打開一次瀏覽器,然后關閉再打開
@pytest.fixture
def fox():
    fox1 = webdriver.Firefox()
    print("login")
    return fox1

def test_seacher(fox):
    fox.get("https://baidu.com")
    fox.quit()

def test_seacher1(fox):
    fox.find_element_by_id('kw').send_keys("pytest")
    fox.find_element_by_id('su').click()
    fox.quit()

這里是單獨的fixture直接同一檔案下呼叫,打開兩開瀏覽器,有點像unittest中的setup用法,這里的test_seacher1`又再次打開了一次瀏覽器導致不是百度界面無法定位到元素,

那么我們看看session怎么用------conftest.py檔案

import pytest
from selenium import webdriver

@pytest.fixture(scope='session')
def fox():
    fox = webdriver.Firefox()
    yield fox

demo.py檔案

@pytest.mark.usefixtures('fox')
class TestCase():
    def test01(self,fox):
        fox.get("https://baidu.com")
        print(fox.title)

    def test02(self,fox):
        fox.find_element_by_id('kw').send_keys("pytest")
        fox.find_element_by_id('su').click()

    def test03(self,fox):
        fox.quit()

這里用到了mark標簽中的usefixtures方法,不用解釋應該也知道了有use的地方是什么意思了吧,使用fixture方法,這里直接引入了conftest中的fox,只打開一次瀏覽器就能往下定位了,是不是很神奇,當然,module也是用在conftest里面,


引數化

有點像資料驅動,可以處理一些測驗資料,簡單的看看它的一個格式情況:

argnames:引數名
argvalues:引數對應值,型別必須為list

datas = [('qingan', '123'),('qingqingan', '123456')]
class TestQingan:

    @pytest.mark.parametrize(argnames=['username', 'password'], argvalues=datas)
    def testqing01(self, username, password):
        # 這里的運行兩個用例
        print("處處把歡喜")
        print(username, password)

這里會把datas中的資料決議出來:串列中有幾個元組就有幾個對應的資料,

當然,還有一種情況就是會隨機匹配對應的數值,說的比較抽象我們直接看看:

class TestQingan:   
    @pytest.mark.parametrize("username",["qingan","123456"])
    @pytest.mark.parametrize("password",["qingqingan","123456"])
    def testqing01(self, username, password):
        # 這里的運行兩個用例
        print("處處把歡喜")
        print(username, password)

如果你這樣寫了,那么pytest會把username跟password中的串列打亂,然后一一匹配:


命名

不知道你是否喜歡pytest的命名規則,如果不喜歡,此處有一好辦法,幫你解決,

跟目錄下創建一個pytest.ini檔案,在里面這樣寫,pytest會自動去識別,往下看會解釋規則

[pytest]

addopts= -s -vv --alluredir=./result/xml

testpaths=../P_pytest/inidemo

python_files=test*.py

python_classes=Qing*

python_functions=qing*

以我上述的例子為例題運行出來的效果也與上述沒有太大的差別,只是更改了名字而已:

class Qingan:
 
    @pytest.mark.parametrize("username",["qingan","123456"])
    @pytest.mark.parametrize("password",["qingqingan","123456"])
    def qing01(self, username, password):
        # 這里的運行兩個用例
        print("處處把歡喜")
        print(username, password)

好了,下面解釋一下pytest.ini里面的配置規則

[pytest]

addopts= -s -vv --alluredir=./result/xml
addopts= -s -vv --html=./report/test.html
# 這里是檔案運行的目錄../表示上級目錄

# 這里是ALLURE測驗報告資料存放的地方
addopts= -s -vv --alluredir=./result/xml
# 控制臺運行輸出報告        這里指定生成資料的地方   這里指定輸出報告的地方
# allure generate --clean ./result/xml -o ./result/html   這里是在控制臺輸出的,可別搞混了

# 這里是尋找執行用例所存放的檔案
testpaths=../P_pytest/inidemo

# 尋找執行用例,這里可更改用例名稱,不在是test開頭
python_files=test*.py

# 尋找對應的類運行
python_classes=Qing*

# 基于上述條件尋找對應的用例運行
python_functions=qing*

明白的安排上,前面將了一些allure測驗報告的生成,怕你各位沒看懂!

注意:pytest.ini中除了必須的配置引數外,不要存在其他的東西,漢字,字符,注釋等,

擴展

既然生成了allure報告,為何不好好發揮一下呢,我們往報告里加入截圖:

class Qingan:
    def qing02(self):
        fox = webdriver.Firefox()
        try:
            fox.get('https://baidu.com')
            time.sleep(3)
        except Exception as e:
            """點擊錯誤的時候在報告中插入截圖"""
            file_path = './img/' + str(int(time.time())) + ".png"
            fox.save_screenshot(file_path)
            with open(file_path, mode='rb') as file_img:
                f = file_img.read()
            # 此處的shouye是放在allure報告中的名字
            allure.attach(f, 'shouye', allure.attachment_type.PNG)

        fox.quit()

代碼給到各位,僅限于借鑒參考!

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/303700.html

標籤:其他

上一篇:首批 iPhone 13 用戶直呼太“坑”:?拍照有馬賽克、與 Apple Watch “失聯”、第三方 App 還不能用高刷?

下一篇:《微服務架構設計模式》讀書筆記 | 第10章 微服務架構中的測驗策略(下)

標籤雲
其他(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)

熱門瀏覽
  • 面試突擊第一季,第二季,第三季

    第一季必考 https://www.bilibili.com/video/BV1FE411y79Y?from=search&seid=15921726601957489746 第二季分布式 https://www.bilibili.com/video/BV13f4y127ee/?spm_id_fro ......

    uj5u.com 2020-09-10 05:35:24 more
  • 第三單元作業總結

    1.前言 這應該是本學期最后一次寫作業總結了吧。總體來說,對作業的節奏也差不多掌握了,作業做起來的效率也更高了。雖然和之前的作業一樣,作業中都要用到新的知識,但是相比之前,更加懂得了如何利用工具以及資料。雖然之間卡過殼,但總體而言,這幾次作業還算完成的比較好。 2.作業程序總結 相比前兩個單元,此單 ......

    uj5u.com 2020-09-10 05:35:41 more
  • 北航OO(2020)第四單元博客作業暨課程總結博客

    北航OO(2020)第四單元博客作業暨課程總結博客 本單元作業的架構設計 在本單元中,由于UML圖具有比較清晰的樹形結構,因此我對其中需要進行查詢操作的元素進行了包裝,在樹的父節點中存盤所有孩子的參考。考慮到性能問題,我采用了快取機制,一次查詢后盡可能快取已經遍歷過的資訊,以減少遍歷次數。 本單元我 ......

    uj5u.com 2020-09-10 05:35:48 more
  • BUAA_OO_第四單元

    一、UML決議器設計 ? 先看下題目:第四單元實作一個基于JDK 8帶有效性檢查的UML(Unified Modeling Language)類圖,順序圖,狀態圖分析器 MyUmlInteraction,實際上我們要建立一個有向圖模型,UML中的物件(元素)可能與同級元素連接,也可與低級元素相連形成 ......

    uj5u.com 2020-09-10 05:35:54 more
  • 6.1邏輯運算子

    邏輯運算子 1. && 短路與 運算式1 && 運算式2 01.運算式1為true并且運算式2也為true 整體回傳為true 02.運算式1為false,將不會執行運算式2 整體回傳為false 03.只要有一個運算式為false 整體回傳為false 2. || 短路或 運算式1 || 運算式2 ......

    uj5u.com 2020-09-10 05:35:56 more
  • BUAAOO 第四單元 & 課程總結

    1. 第四單元:StarUml檔案決議 本單元采用了圖模型決議UML。 UML檔案可以抽象為圖、子圖、邊的邏輯結構。 在實作中,圖的節點包括類、介面、屬性,子圖包括狀態圖、順序圖等。 采用了三次遍歷UML元素的方法建圖,第一遍遍歷建點,第二、三次遍歷設定屬性、連邊,實作圖物件的初始化。這里借鑒了一些 ......

    uj5u.com 2020-09-10 05:36:06 more
  • 談談我對C# 多型的理解

    面向物件三要素:封裝、繼承、多型。 封裝和繼承,這兩個比較好理解,但要理解多型的話,可就稍微有點難度了。今天,我們就來講講多型的理解。 我們應該經常會看到面試題目:請談談對多型的理解。 其實呢,多型非常簡單,就一句話:呼叫同一種方法產生了不同的結果。 具體實作方式有三種。 一、多載 多載很簡單。 p ......

    uj5u.com 2020-09-10 05:36:09 more
  • Python 資料驅動工具:DDT

    背景 python 的unittest 沒有自帶資料驅動功能。 所以如果使用unittest,同時又想使用資料驅動,那么就可以使用DDT來完成。 DDT是 “Data-Driven Tests”的縮寫。 資料:http://ddt.readthedocs.io/en/latest/ 使用方法 dd. ......

    uj5u.com 2020-09-10 05:36:13 more
  • Python里面的xlrd模塊詳解

    那我就一下面積個問題對xlrd模塊進行學習一下: 1.什么是xlrd模塊? 2.為什么使用xlrd模塊? 3.怎樣使用xlrd模塊? 1.什么是xlrd模塊? ?python操作excel主要用到xlrd和xlwt這兩個庫,即xlrd是讀excel,xlwt是寫excel的庫。 今天就先來說一下xl ......

    uj5u.com 2020-09-10 05:36:28 more
  • 當我們創建HashMap時,底層到底做了什么?

    jdk1.7中的底層實作程序(底層基于陣列+鏈表) 在我們new HashMap()時,底層創建了默認長度為16的一維陣列Entry[ ] table。當我們呼叫map.put(key1,value1)方法向HashMap里添加資料的時候: 首先,呼叫key1所在類的hashCode()計算key1 ......

    uj5u.com 2020-09-10 05:36:38 more
最新发布
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:20:47 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:20:25 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:20:17 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:20:10 more
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:19:44 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:19:07 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:18:57 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:18:49 more
  • 05單件模式

    #經典的單件模式 public class Singleton { private static Singleton uniqueInstance; //一個靜態變數持有Singleton類的唯一實體。 // 其他有用的實體變數寫在這里 //構造器宣告為私有,只有Singleton可以實體化這個類! ......

    uj5u.com 2023-04-19 08:42:51 more
  • 【架構與設計】常見微服務分層架構的區別和落地實踐

    軟體工程的方方面面都遵循一個最基本的道理:沒有銀彈,架構分層模型更是如此,每一種都有各自優缺點,所以請根據不同的業務場景,并遵循簡單、可演進這兩個重要的架構原則選擇合適的架構分層模型即可。 ......

    uj5u.com 2023-04-19 08:42:41 more