Cucumber 黃瓜測試 BDD 從入門到精通

1. Cucumber

Cucumber 是 BDD(Behavior-Driven Development盾致,行為驅(qū)動開發(fā))的一個(gè)自動化測試工具,使用自然語言來描述測試用例毕谴,使得 非研發(fā)(QA、PM)也可以理解甚至編寫 測試用例距芬。

官方表示:應(yīng)該將 Cucumber 視為一個(gè)【文檔編寫工具】涝开,而非一個(gè)單純的自動化測試工具

撰寫時(shí),應(yīng)該要以 PM 也能理解 測試用例 為目標(biāo)去編寫 Cucumber

2. Gherkin

Gherkin 是 Cucumber 用來描述 測試用例 的語言框仔,以下為關(guān)鍵字的用意與關(guān)聯(lián)關(guān)系舀武。

以 分享概覽 為例

Given:新增 帳號abc@qq.com 、新增 概覽1

When:將 概覽1 分享給 帳號abc@qq.com

Then:校驗(yàn) 帳號abc@qq.com 是否能查看到 概覽1

2.1 Scenario 范例

Feature: 授權(quán)功能Scenario: 帳號 通過綁定 角色 進(jìn)行授權(quán)? ? ? ? Given 新增角色'分析師'离斩,擁有權(quán)限'1001, 1002, 1003'And 新增帳號'abc@qq.com'When 帳號'abc@qq.com'綁定角色'分析師'Then 鑒權(quán) 帳號'abc@qq.com'银舱,有權(quán)限'1001'And? 鑒權(quán) 帳號'abc@qq.com',有權(quán)限'1002'But? 鑒權(quán) 帳號'abc@qq.com'跛梗,沒有權(quán)限'1005'復(fù)制代碼

2.2 Background 范例

Feature: 授權(quán)功能Background:? ? ? Given 新增帳號'abc@qq.com'Scenario: 帳號 通過綁定 角色 進(jìn)行授權(quán)? ? ? ? Given 新增角色'分析師'寻馏,擁有權(quán)限'1001, 1002, 1003'When 帳號'abc@qq.com'綁定角色'分析師'Then 鑒權(quán) 帳號'abc@qq.com',有權(quán)限'1001'And? 鑒權(quán) 帳號'abc@qq.com'核偿,有權(quán)限'1002'But? 鑒權(quán) 帳號'abc@qq.com'诚欠,沒有權(quán)限'1005'Scenario: 帳號 通過綁定 機(jī)構(gòu) 進(jìn)行授權(quán)? ? ? ? Given 新增機(jī)構(gòu)'北京部門',擁有權(quán)限'2001, 2002, 2003'When 帳號'abc@qq.com'綁定機(jī)構(gòu)'北京部門'Then 鑒權(quán) 帳號'abc@qq.com'漾岳,有權(quán)限'2001'And? 鑒權(quán) 帳號'abc@qq.com'轰绵,有權(quán)限'2002'But? 鑒權(quán) 帳號'abc@qq.com',沒有權(quán)限'2005'復(fù)制代碼

2.3 Scenario Outline 范例

可以在多個(gè) Step 上共用同一個(gè) "簡單" 參數(shù)尼荆,且每一個(gè) Example 都視為一個(gè) Scenario

Feature:授權(quán)功能Scenario Outline:帳號通過綁定角色進(jìn)行授權(quán)Given新增角色<role>左腔,擁有權(quán)限<permissions>When新增帳號<account>Then帳號<account>綁定角色<role>And鑒權(quán)帳號<account>,有權(quán)限<has_permission>Examples:|role|permissions|account|has_permission||分析師|1001,1002,1003|abc@qq.com|1001||開發(fā)者|2001,2002,2003|cde@qq.com|2001||管理員|3001,3002,3003|fgh@qq.com|3001|復(fù)制代碼

3. 基本概念

3.1 文件結(jié)構(gòu)

Gherkin 寫在 .feature 文件中

Step 對應(yīng)的邏輯 寫在 .java 文件中

3.2 Step 映射

通過 Gherkin 語法上的描述捅儒,找到與 注解 value 值匹配的 Java 方法液样,將 Gherkin 與 Java 代碼關(guān)聯(lián)起來。

3.3 Scenario 獨(dú)立

當(dāng)同時(shí)執(zhí)行多個(gè) Scenario 時(shí)巧还,執(zhí)行每個(gè) Scenario 對應(yīng)的 Java 文件都會被重新創(chuàng)建蓄愁。

不同的 Scenario 之間,不應(yīng)該存在數(shù)據(jù)依賴(MySQL)狞悲,如果存在依賴撮抓,將會使 Scenario 變得脆弱可以在 Backgroud,進(jìn)行數(shù)據(jù)清理摇锋,來保證測試結(jié)果的正確性

二丹拯、最佳實(shí)踐

1. 撰寫 Scenairo 原則 - BRIEF

school.cucumber.io/courses/tak…

B:Business Language站超。

Scenairo 中使用的詞語應(yīng)該使用【業(yè)務(wù)團(tuán)隊(duì)成員】能夠理解的詞語,否則將無法與業(yè)務(wù)團(tuán)隊(duì)成員互動乖酬。

R:Real Data死相。

Scenairo 中應(yīng)該使用 具體、真實(shí) 的數(shù)據(jù)(不要用 1咬像、2算撮、3、A县昂、B肮柜、C),有助于讓場景變得生動倒彰,并及早揭示邊界條件與基本假設(shè)审洞。

I:Intention Revealing。

Scenairo 應(yīng)該描述試圖實(shí)現(xiàn)的意圖待讳,而不是描述程式將如何實(shí)現(xiàn)它的機(jī)制芒澜。

確保每一行 Step 描述的是 意圖 而非 機(jī)制。 (比如:創(chuàng)建帳號创淡,就不要寫成 "將帳號數(shù)據(jù)寫入 user 表痴晦,并在 account_project 表綁定帳號與項(xiàng)目的關(guān)聯(lián)")

E:Essential。

Scenairo 應(yīng)該只保留必要的 Step琳彩,不直接促成結(jié)果的場景都應(yīng)該被刪除阅酪。

任何不能增加讀者對預(yù)期行為理解的場景,都不應(yīng)該出現(xiàn)在文檔中汁针。

F:Focus术辐。

多數(shù)的 Scenairo 應(yīng)該只專注于單一職責(zé)。

BRIEF

建議將大多數(shù)的 Scenairo 限制在五行或更少施无,這將使它們更易于閱讀與推理辉词,并有助于避免 同時(shí)測試多個(gè)規(guī)則 或 增加額外細(xì)節(jié)。

2. 保證 Scenairo 可讀性好處

school.cucumber.io/courses/tak…

隨時(shí)獲得 你做的事情是否正確 的反饋

你的 Feature 可以變成描述你 系統(tǒng)功能 的 線上文檔

Scenairo 將會引導(dǎo)你的技術(shù)設(shè)計(jì)

3. 開發(fā)流程推薦

school.cucumber.io/courses/tak…

在 Cucumber 中描述你想要實(shí)現(xiàn)的 Scenairo猾骡,把所有的 Step 串連起來瑞躺,并運(yùn)行 Cucumber 使其出現(xiàn) 失敗 結(jié)果

持續(xù)實(shí)現(xiàn) Step 與 API 的具體邏輯,并觀察 API 是如何 失敗 的兴想,最終使 Scenairo 的結(jié)果變?yōu)?成功幢哨。

當(dāng)測試通過后,對 API 實(shí)現(xiàn)進(jìn)行 清理 與 優(yōu)化(重構(gòu))嫂便,使其更具可讀性捞镰,并再次運(yùn)行 Cucumber 保證重構(gòu)后的結(jié)果正確。

以上為 測試驅(qū)動開發(fā)(TDD) 的 生命周期: Red、Green岸售、Clean

如果改壞了系統(tǒng)邏輯践樱,你的測試用例會告訴你。

推薦:在研發(fā)進(jìn)行技術(shù)設(shè)計(jì)前凸丸,再多加一個(gè) 測試用例評審 的環(huán)節(jié)拷邢,讓 PM、QA屎慢、RD 一起參與瞭稼,方便及早發(fā)現(xiàn)問題,也能增加技術(shù)設(shè)計(jì)時(shí)考量的全面性

三腻惠、Cucumber 常用功能

1. 參數(shù)化

參數(shù)化 可以與 表格化环肘、列表化、對象化 混用

1.1 關(guān)鍵字

類型正則

biginteger"-?\d+" 或者 "\d+"

string"([^"\]?(\.[^"\]?)*)"

bigdecimal"-?\d*[.,]\d+"

byte"-?\d+" 或者 "\d+"

double"-?\d*[.,]\d+"

short"-?\d+" 或者 "\d+"

float"-?\d*[.,]\d+"

word"\w+"

int"-?\d+" 或者 "\d+"

long"-?\d+" 或者 "\d+"

1.2 說明

Cucumber 支持在 Java 注解 中使用 {關(guān)鍵字} 作為占位符妖枚。 在 Step 中直接寫上參數(shù)廷臼,將在 Java 代碼中苍在,會把占位符對應(yīng)的參數(shù)作為方法參數(shù)傳遞進(jìn)去绝页。

字串 類型的 關(guān)鍵字,需要加上 單引號 或 雙引號 作為聲明

注解中聲明占位符的順序 為 注入方法參數(shù)的順序

1.3 范例

Feature: 授權(quán)功能Scenario: 鑒權(quán)場景? ? ? ? ? Given 創(chuàng)建帳號'waiting001@qq.com'寂恬,角色'admin'续誉,項(xiàng)目id1復(fù)制代碼

@Given("創(chuàng)建帳號 {string},角色 {string}初肉,項(xiàng)目id {int}")publicvoidtest(Stringusername,Stringrole, Integer projectId) {? ? ? log.info("start to execute test(), params:[ username = {}, role = {}, projectId = {} ]",? ? ? ? ? ? ? username, role, projectId);? }復(fù)制代碼

2. 表格化(DataTable)

2.1 設(shè)置 Gherkin 數(shù)據(jù)

下方的 List - Map酷鸦、List - List、Map - List 都是共用同一套 Gherkin 代碼牙咏,也就是說臼隔,同一個(gè) Gherkin 代碼,Cucumber 可以根據(jù)不同的方法參數(shù)類型妄壶,自動進(jìn)行轉(zhuǎn)換

Feature: 授權(quán)功能Scenario: 鑒權(quán)場景? ? ? ? Given 創(chuàng)建帳號? ? ? ? | username? ? ? ? ? | password | role? ? ? | project_id |? ? ? ? | waiting001@qq.com | a123456? | admin? ? |1|? ? ? ? | waiting002@qq.com | b123456? | analyst? |2|? ? ? ? | waiting003@qq.com | c123456? | developer |3|復(fù)制代碼

2.2 List - Map(常用)

@Given("創(chuàng)建帳號")publicvoid test(List> dataTable) {for(Mapdata: dataTable) {? ? ? ? ? String username =data.get("username");? ? ? ? ? String password =data.get("password");? ? ? ? ? String role =data.get("role");? ? ? ? ? String projectId =data.get("project_id");? ? ? ? ? log.info("execute test(), fields:[ username = {}, password = {}, role = {}, projectId = {} ]",? ? ? ? ? ? ? ? ? username, password, role, projectId);? ? ? }? ? }復(fù)制代碼

2.3 List - List

@Given("創(chuàng)建帳號")publicvoid test(List> dataTable) {for(Listdata: dataTable) {? ? ? ? ? log.info("execute test(), fields:[ data = {} ]",data);? ? ? }? ? }復(fù)制代碼

2.4 Map - List

@Given("創(chuàng)建帳號")? publicvoidtest(Map> dataTable) {for(Map.Entry> data : dataTable.entrySet()) {Stringusername = data.getKey();? ? ? ? ? List infos = data.getValue();? ? ? ? ? log.info("execute test(), fields:[ username = {}, infos = {} ]", username, infos);? ? ? }? ? }復(fù)制代碼

3. 列表化

3.1 直列表

Feature: 授權(quán)功能Scenario: 鑒權(quán)場景? ? ? ? Given 刪除帳號? ? ? ? | waiting001@qq.com |? ? ? ? | waiting002@qq.com |? ? ? ? | waiting003@qq.com |復(fù)制代碼

@Given("刪除帳號")publicvoidtest(List<String> usernames){log.info("execute test(), fields:[ usernames = {} ]", usernames);? }復(fù)制代碼

3.2 橫列表

Feature: 授權(quán)功能Scenario: 鑒權(quán)場景? ? ? ? Given 刪除帳號? ? ? ? | waiting001@qq.com | waiting002@qq.com | waiting003@qq.com |復(fù)制代碼

@Given("刪除帳號")? public void test(@TransposeList usernames) {log.info("execute test(), fields:[ usernames = {} ]", usernames);? }復(fù)制代碼

記得加上 @Transpose摔握,告訴 Cucumber 需要進(jìn)行數(shù)據(jù)轉(zhuǎn)換

4. 對象化

4.1 撰寫 Gherkin 語法

Feature: 授權(quán)功能Scenario: 鑒權(quán)場景? ? ? ? Given 新增 帳號? ? ? ? | username? ? ? ? | role? ? ? | project? ? |? ? ? ? | waiting1@qq.com | admin? ? | default? ? |? ? ? ? | waiting2@qq.com | analyst? | production |? ? ? ? | waiting3@qq.com | developer | default? ? |復(fù)制代碼

4.2 定義 Java 對象

@DatastaticclassAccount {/**?

? ? * 帳號?

? ? */privateStringusername;/**?

? ? * 角色?

? ? */privateStringrole;/**?

? ? * 項(xiàng)目?

? ? */privateStringproject;? ? }復(fù)制代碼

4.3 撰寫 封裝 Java 對象的 方法

/**?

* 帳號對象 的 封裝方法?

*/@DataTableTypepublicAccount defineAccount(Map entry) {? ? ? ? Account account = new Account();// 如果有指定數(shù)據(jù),則將數(shù)據(jù)寫入? Optional.ofNullable(entry.get("username")).ifPresent(account::setUsername);? ? ? Optional.ofNullable(entry.get("role")).ifPresent(account::setRole);? Optional.ofNullable(entry.get("project")).ifPresent(account::setProject);returnaccount;? }復(fù)制代碼

在封裝方法上方丁寄,需要加上 @DataTableType 注解

4.4 關(guān)聯(lián)具體 Step 方法

@Given("新增 帳號")publicvoidaddAccount(List<Account> accountList){for(Account account : accountList) {log.info("execute addAccount(), fields:[ account = {} ]", account);? ? ? }? ? }復(fù)制代碼

方法參數(shù)中氨淌,直接指定 對象封裝方法 返回的 對象類型,Cucumber 就能直接進(jìn)行關(guān)聯(lián)

5. 參數(shù)化伊磺、表格化盛正、列表化 混合使用

DataTable 與 List 必須作為 Java 方法的最后一個(gè)參數(shù)

5.1 表格化&參數(shù)化

Feature: 授權(quán)功能Scenario: 鑒權(quán)場景? ? ? ? Given 創(chuàng)建帳號,項(xiàng)目'default'| username? ? ? ? ? | password | role? ? ? |? ? ? ? | waiting001@qq.com | a123456? | admin? ? |? ? ? ? | waiting002@qq.com | b123456? | analyst? |? ? ? ? | waiting003@qq.com | c123456? | developer |復(fù)制代碼

@Given("創(chuàng)建帳號屑埋,項(xiàng)目 {string}")? publicvoidtest(Stringproject, List> dataTable) {? ? ? ? log.info("execute test(), fields:[ project = {} ]", project);for(Map data : dataTable) {Stringusername = data.get("username");Stringpassword = data.get("password");Stringrole = data.get("role");? ? ? ? ? log.info("execute test(), fields:[ username = {}, password = {}, role = {} ]",? ? ? ? ? ? ? ? ? username, password, role);? ? ? }? ? }復(fù)制代碼

List<Map<String, String>> 必須作為最后一個(gè)方法參數(shù)

5.2 直列表&參數(shù)化

Feature: 授權(quán)功能Scenario: 鑒權(quán)場景? ? ? ? Given 刪除帳號豪筝,項(xiàng)目'default'| waiting001@qq.com |? ? ? ? | waiting002@qq.com |? ? ? ? | waiting003@qq.com |復(fù)制代碼

@Given("刪除帳號,項(xiàng)目 {string}")publicvoidtest(StringprojectName, List usernames) {? ? ? log.info("execute test(), fields:[ projectName = {}, usernames = {} ]", projectName, usernames);? }復(fù)制代碼

List 必須作為最后一個(gè)方法參數(shù)

5.3 橫列表&參數(shù)化

Feature: 授權(quán)功能Scenario: 鑒權(quán)場景? ? ? ? Given 刪除帳號,項(xiàng)目'default'| waiting001@qq.com | waiting002@qq.com | waiting003@qq.com |復(fù)制代碼

@Given("刪除帳號壤蚜,項(xiàng)目 {string}")? public void test(String project,@TransposeList usernames) {log.info("execute test(), fields:[ project = {}, usernames = {} ]", project, usernames);? }復(fù)制代碼

5.4 對象化&參數(shù)化

Feature: 授權(quán)功能Scenario: 鑒權(quán)場景? ? ? ? Given 新增 帳號即寡,機(jī)構(gòu)'北京部門'| username? ? ? ? | role? ? ? | project? ? |? ? ? ? | waiting1@qq.com | admin? ? | default? ? |? ? ? ? | waiting2@qq.com | analyst? | production |? ? ? ? | waiting3@qq.com | developer | default? ? |復(fù)制代碼

@Given("新增 帳號,機(jī)構(gòu) {string}")publicvoidaddAccount(String organization, List<Account> accountList){log.info("execute addAccount(), fields:[ organization = {} ]", organization);for(Account account : accountList) {log.info("execute addAccount(), fields:[ account = {} ]", account);? ? ? }? ? }復(fù)制代碼

6. 鉤子方法(Hook)

6.1 注解

注解執(zhí)行時(shí)機(jī)

@BeforeAll在啟動 Cucumber 時(shí)執(zhí)行

@Before在所有 Scenario 執(zhí)行之前執(zhí)行

@BeforeStep在所有 Step 執(zhí)行之前執(zhí)行

@AfterAll在結(jié)束 Cucumber 時(shí)執(zhí)行

@After在所有 Scenario 執(zhí)行之后執(zhí)行

@AfterStep在所有 Step 執(zhí)行之后執(zhí)行

指定注解的 value袜刷,可以指定 Hook 的運(yùn)行范圍聪富,不指定則表示在全項(xiàng)目生效。 注解可以定義在項(xiàng)目中的任意位置著蟹。

如果同時(shí)定義了多個(gè)鉤子方法墩蔓,則會依照注解中 order 屬性的順序多次執(zhí)行。

6.2 全局生效范例

Gherkin 代碼

Feature:測試功能? Scenario:測試場景1? Given測試功能1? When測試功能2? Then測試功能3? Scenario:測試場景2? Given測試功能1? When測試功能2? Then測試功能3復(fù)制代碼

Java 代碼

@Slf4jpublicclassTestDefs{@Beforepublicvoidbefore(){? ? ? ? ? log.info("執(zhí)行 @Before 方法");? ? ? }@BeforeSteppublicvoidbeforeStep(){? ? ? ? ? log.info("執(zhí)行 @BeforeStep 方法");? ? ? }@Afterpublicvoidafter(){? ? ? ? ? log.info("執(zhí)行 @After 方法");? ? ? }@AfterSteppublicvoidafterStep(){? ? ? ? ? log.info("執(zhí)行 @AfterStep 方法");? ? ? }@Given("測試功能1")publicvoidtest1(){? ? ? ? ? log.info("執(zhí)行 測試功能1");? ? ? }@Given("測試功能2")publicvoidtest2(){? ? ? ? ? log.info("執(zhí)行 測試功能2");? ? ? }@Given("測試功能3")publicvoidtest3(){? ? ? ? ? log.info("執(zhí)行 測試功能3");? ? ? }? }復(fù)制代碼

最終結(jié)果

6.3 局部生效范例

Gherkin 代碼在不同的 Scenario 上萧豆,可以增加 自定義注解 作為標(biāo)記

Feature: 測試功能@MyHookScenario: 測試場景1Given 測試功能1When? 測試功能2@YourHookScenario: 測試場景2Given 測試功能1When? 測試功能2復(fù)制代碼

Java 代碼Hook 注解的 value 值奸披,可以用來指定,只有當(dāng) Scenario 上有該自定義注解時(shí)涮雷,才會執(zhí)行 Hook 方法阵面。

如果想將 Hook 方法在多個(gè)自定義注解下進(jìn)行復(fù)用,可以通過 , 隔開洪鸭,例如:@Before("@MyHook,@YourHook")

@Slf4jpublicclassTestDefs{@Before("@MyHook")publicvoidmyHookBefore(){? ? ? ? ? log.info("執(zhí)行 @MyHook 的 @Before 方法");? ? ? }@BeforeStep("@MyHook")publicvoidmyHookBeforeStep(){? ? ? ? ? log.info("執(zhí)行 @MyHook 的 @BeforeStep 方法");? ? ? }@Before("@YourHook")publicvoidyourHookBefore(){? ? ? ? ? log.info("執(zhí)行 @YourHook 的 @Before 方法");? ? ? }@BeforeStep("@YourHook")publicvoidyourHookBeforeStep(){? ? ? ? ? log.info("執(zhí)行 @YourHook 的 @BeforeStep 方法");? ? ? }@Given("測試功能1")publicvoidtest1(){? ? ? ? ? log.info("執(zhí)行 測試功能1");? ? ? }@When("測試功能2")publicvoidtest2(){? ? ? ? ? log.info("執(zhí)行 測試功能2");? ? ? }? ? }復(fù)制代碼

最終結(jié)果

四样刷、Gherkin 模版范例

0. Gherkin 模版撰寫規(guī)范

所有 模版功能 只運(yùn)行在 測試項(xiàng)目(project_id = 1) (避免有時(shí)要指定 project_id 有時(shí)又不需要的麻煩)

使用 Gherkin 參數(shù)化 的 字串 功能時(shí),使用 單引號 將字串包裹 (考慮到模版參數(shù)可能出現(xiàn) Json 字串览爵,使用雙引號會需要額外進(jìn)行轉(zhuǎn)譯)

模版參數(shù)中置鼻,不要出現(xiàn) id(包含 帳號id、角色id蜓竹、職務(wù)id ... 等)箕母,應(yīng)該改用 名稱(用戶名、角色中文名稱俱济、職務(wù)名稱)去反查 (使用 id 將無可避免的出現(xiàn)要使用 上下文 將多個(gè) Step 進(jìn)行關(guān)聯(lián)的問題嘶是,這將使測試用例變得脆弱,所以寧可用 名稱 去反查 id蛛碌,也不要直接指定 id)

Gherkin 語法表格化的表頭字段聂喇,使用 下滑線命名法 來命名

模版方法名稱定義遵守以下規(guī)范 (當(dāng)一個(gè)模版可能同時(shí)存在于 Given 與 When 時(shí),以 When 為主)

模版關(guān)鍵字說明范例

Given以 [模塊][新增or更新or刪除] + 空格 開頭[帳號][新增] 新增帳號左医、[角色][更新] 更新角色

When以 [模塊][功能] + 空格 開頭[權(quán)限][功能] 授權(quán)數(shù)據(jù)資源權(quán)限授帕、[權(quán)限][功能] 刪除數(shù)據(jù)資源權(quán)限數(shù)據(jù)

Then以 [模塊][校驗(yàn)] + 空格 開頭[權(quán)限][校驗(yàn)] 校驗(yàn)帳號權(quán)限

隨時(shí)注意編寫的模版是否盡量符合第 2 大項(xiàng)的最佳實(shí)踐

1. 帳號

通常為 Given 的最后一步,比如 帳號 要綁定 角色浮梢,一定是先創(chuàng)建好 角色跛十,再通過 新增帳號 進(jìn)行綁定

1.1 新增 帳號

(創(chuàng)建前自動刪除原來的帳號、創(chuàng)建時(shí)允許指定角色)

屬性說明必填默認(rèn)值

username用戶名是無

password密碼否AAAaaa111@

user_cname帳號中文名稱否與 username 相同

email信箱否與 username 相同

role_cname角色中文名稱秕硝,默認(rèn)角色用 role_name 即可否admin

# 最簡單的范例Given [帳號][新增] 新增帳號? ? | username? ? ? ? ? |? ? | waiting001@qq.com |? ? | waiting002@qq.com |? ? | waiting003@qq.com |# 最完整的范例Given [帳號][新增] 新增帳號? ? | username? ? ? ? ? | password? | user_cname? ? ? ? | email? ? ? ? ? ? | role_cname |? ? | waiting001@qq.com | AAAaaa111@ | waiting001@qq.com | waiting001@qq.com | admin? ? ? |? ? | waiting002@qq.com | AAAaaa111@ | waiting002@qq.com | waiting002@qq.com | analyst? ? |? ? | waiting003@qq.com | AAAaaa111@ | waiting003@qq.com | waiting003@qq.com | developer? |復(fù)制代碼

1.2 更新 帳號 的 角色

Given [帳號][更新] 更新帳號 'waiting001@qq.com' 的角色? ? | 角色A | 角色B | 角色C |復(fù)制代碼

1.3 更新 帳號 的 職務(wù)

Given [帳號][更新] 更新帳號 'waiting001@qq.com' 的職務(wù)? ? | 職務(wù)A | 職務(wù)B | 職務(wù)C |復(fù)制代碼

1.4 刪除 帳號

Given [帳號][刪除] 刪除帳號? ? | waiting001@qq.com |? ? | waiting002@qq.com |? ? | waiting003@qq.com |? ? | waiting004@qq.com |復(fù)制代碼

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末芥映,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌奈偏,老刑警劉巖坞嘀,帶你破解...
    沈念sama閱讀 222,104評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異惊来,居然都是意外死亡丽涩,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評論 3 399
  • 文/潘曉璐 我一進(jìn)店門裁蚁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來矢渊,“玉大人,你說我怎么就攤上這事枉证“校” “怎么了?”我有些...
    開封第一講書人閱讀 168,697評論 0 360
  • 文/不壞的土叔 我叫張陵室谚,是天一觀的道長毡鉴。 經(jīng)常有香客問我,道長秒赤,這世上最難降的妖魔是什么猪瞬? 我笑而不...
    開封第一講書人閱讀 59,836評論 1 298
  • 正文 為了忘掉前任,我火速辦了婚禮倒脓,結(jié)果婚禮上撑螺,老公的妹妹穿的比我還像新娘含思。我一直安慰自己崎弃,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,851評論 6 397
  • 文/花漫 我一把揭開白布含潘。 她就那樣靜靜地躺著饲做,像睡著了一般。 火紅的嫁衣襯著肌膚如雪遏弱。 梳的紋絲不亂的頭發(fā)上盆均,一...
    開封第一講書人閱讀 52,441評論 1 310
  • 那天,我揣著相機(jī)與錄音漱逸,去河邊找鬼泪姨。 笑死,一個(gè)胖子當(dāng)著我的面吹牛饰抒,可吹牛的內(nèi)容都是我干的肮砾。 我是一名探鬼主播,決...
    沈念sama閱讀 40,992評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼袋坑,長吁一口氣:“原來是場噩夢啊……” “哼仗处!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,899評論 0 276
  • 序言:老撾萬榮一對情侶失蹤婆誓,失蹤者是張志新(化名)和其女友劉穎吃环,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體洋幻,經(jīng)...
    沈念sama閱讀 46,457評論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡郁轻,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,529評論 3 341
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了文留。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片范咨。...
    茶點(diǎn)故事閱讀 40,664評論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖厂庇,靈堂內(nèi)的尸體忽然破棺而出渠啊,到底是詐尸還是另有隱情,我是刑警寧澤权旷,帶...
    沈念sama閱讀 36,346評論 5 350
  • 正文 年R本政府宣布替蛉,位于F島的核電站,受9級特大地震影響拄氯,放射性物質(zhì)發(fā)生泄漏躲查。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,025評論 3 334
  • 文/蒙蒙 一译柏、第九天 我趴在偏房一處隱蔽的房頂上張望镣煮。 院中可真熱鬧,春花似錦鄙麦、人聲如沸典唇。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽介衔。三九已至,卻和暖如春骂因,著一層夾襖步出監(jiān)牢的瞬間炎咖,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評論 1 272
  • 我被黑心中介騙來泰國打工寒波, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留乘盼,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,081評論 3 377
  • 正文 我出身青樓俄烁,卻偏偏與公主長得像绸栅,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子猴娩,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,675評論 2 359

推薦閱讀更多精彩內(nèi)容