從零開始寫一個(gè)契約測(cè)試工具——數(shù)據(jù)庫(kù)設(shè)計(jì)

接上文,第一步需要設(shè)計(jì)我們的表結(jié)構(gòu),我初步的構(gòu)想是兩張表來裝下它,后續(xù)肯定會(huì)有一些變動(dòng),因?yàn)槲乙彩且贿厡懝ぞ咭贿呌涗浀摹?/p>

設(shè)計(jì)說明

工具應(yīng)該有兩塊內(nèi)容,第一塊是契約的信息,這部分記錄的契約的結(jié)構(gòu)體。第二快是子契約,所有具體的值必須由子契約來承載,子契約的內(nèi)容一旦定義后是不可變更的。而契約工具對(duì)消費(fèi)端和生產(chǎn)端的具體報(bào)文內(nèi)容都由子契約來承載。

環(huán)境說明

我使用的是sqlalchemy這個(gè)ORM框架來處理數(shù)據(jù)庫(kù)交互的。表結(jié)構(gòu)的代碼如下

from sqlalchemy import Column, String, Integer
from sqlalchemy.ext.declarative import declarative_base

BaseModel = declarative_base()


class ContractStructure(BaseModel):
    __tablename__ = 'contract_structure'
    id = Column(Integer, primary_key=True)
    contract_name = Column(String(500), nullable=False)
    contract_consumer_body = Column(String(10000), nullable=False)
    contract_consumer_keys = Column(String(500), nullable=False)
    contract_provider_body = Column(String(5000), nullable=False)
    contract_stakeholders = Column(String(500), nullable=False)
    contract_child_ids = Column(String(500), nullable=True)
    contract_version = Column(Integer, default=1)
    contract_last_version = Column(String(1), nullable=False, default='Y')
    provider_url = Column(String(100), nullable=True)


class ContractChild(BaseModel):
    __tablename__ = 'contract_child'
    id = Column(Integer, primary_key=True)
    child_id = Column(String(40), nullable=False)
    child_name = Column(String(100), nullable=False)
    contract_id = Column(Integer)
    child_consumer_body = Column(String(10000), nullable=False)
    child_provider_body = Column(String(5000), nullable=False)

下面我們一個(gè)一個(gè)來說明我這樣設(shè)計(jì)的想法

ContractStructure

這個(gè)表是用來存放契約結(jié)構(gòu)以及契約的一些相關(guān)信息。

  • contract_name

契約名稱,一般來說方便認(rèn)識(shí)的名字比較好,比如Consumer-Provider這種。

  • contract_consumer_body

契約消費(fèi)者的結(jié)構(gòu)體,也就是consumer端發(fā)起的報(bào)文。

  • contract_consumer_keys

契約消費(fèi)者的結(jié)構(gòu)體的key,由于契約測(cè)試中結(jié)構(gòu)體是不可變的,因此必須要校驗(yàn)consumer端傳過來結(jié)構(gòu)的key值,用來確保報(bào)文結(jié)構(gòu)的一致性

  • contract_provider_body

契約生產(chǎn)者的結(jié)構(gòu)體,也就是返回給consumer端的報(bào)文結(jié)構(gòu)

  • contract_stakeholders

契約的干系人,一旦契約發(fā)生變動(dòng),程序需要通知的對(duì)象

  • contract_child_ids

契約子內(nèi)容的id

  • contract_version

契約的版本信息,一旦契約發(fā)生變更,那么版本也要對(duì)應(yīng)的變更

  • contract_last_version

標(biāo)記改版本的契約是否為最新的契約

  • provider_url

生產(chǎn)中的url地址,工具要能夠給provider端發(fā)送契約內(nèi)容,因此需要一個(gè)字段來記錄url

contract_child

這個(gè)表用來存放子契約的內(nèi)容

  • child_name

子契約對(duì)應(yīng)的名字

  • contract_id

所屬契約的id

  • child_consumer_body

消費(fèi)端的報(bào)文內(nèi)容

  • child_provider_body

生產(chǎn)端的報(bào)文內(nèi)容

最后

以上,我們定義了工具的表,下面應(yīng)該做的就是開始寫具體的契約類。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,506評(píng)論 19 139
  • 如今,契約測(cè)試已經(jīng)逐漸成為測(cè)試圈中一個(gè)炙手可熱的話題,特別是在微服務(wù)大行其道的行業(yè)背景下,越來越多的團(tuán)隊(duì)開始關(guān)注服...
    ariman閱讀 12,783評(píng)論 28 33
  • 正如大家所知,最初QA都是手動(dòng)執(zhí)行測(cè)試用例,開發(fā)人員每修改一個(gè)版本,QA就要手動(dòng)測(cè)試一遍,隨著功能的不斷增加,手動(dòng)...
    ThoughtWorks閱讀 3,040評(píng)論 1 18
  • 前端開發(fā)者丨h(huán)ttp請(qǐng)求 https:www.rokub.com 前言見解有限, 如有描述不當(dāng)之處, 請(qǐng)幫忙指出,...
    麋鹿_720a閱讀 11,266評(píng)論 11 31
  • 這里正處島國(guó)日本中部,在一個(gè)普通的住宅區(qū)的小公園里,能捕捉到這樣夕陽無限美的畫面,安靜、祥和……但卻富有生命力...
    宜心園閱讀 206評(píng)論 0 0

友情鏈接更多精彩內(nèi)容