不会自动化UI测试?不会编程?没问题,会造句就行!
上次,我們介紹了用于Web應用程序自動化測試的工具Playwright for .NET。
但是直接使用它來編寫測試用例,代碼比較凌亂,后期也不好維護。
因此,我們利用SpecFlow讓測試用例更好理解和維護。
1.SpecFlow介紹
SpecFlow是.Net平臺下用于行為驅動開發(fā)的開源框架。它使用普通人能夠理解的的軟件需求描述作為軟件測試的基礎,并可以將它們轉換為可執(zhí)行代碼。
詳細介紹可參看官網(wǎng):https://specflow.org/
2.安裝SpecFlow擴展
運行VS2019,選擇菜單“擴展”->“管理擴展”,在打開的窗口在搜索“SpecFlow”:
點擊“下載”按鈕開始安裝,重新啟動VS完成安裝。
3.創(chuàng)建SpecFlow項目
新建項目,選擇“SpecFlow project”模板,點擊“創(chuàng)建”按鈕,在彈出的窗口中選擇.NET框架和測試框架。這里我們選擇MSTest作為測試框架:
點擊“Create”按鈕,最終生成的項目結構如下圖:?
4.添加Feature文件
在解決方案資源管理器的Feature文件夾上點右鍵,添加"SpecFlow Feature File",命名為BaiduAdvancedSearch.feature。
Feature是一個純文本文件,它的作用是使用被稱為Gherkin的語法,按照Given/When/Then的特定示例格式來編寫軟件需求描述。
執(zhí)行百度高級搜索的操作的Feature描述如下:
Feature:?百度高級搜索所有場景必須順序執(zhí)行Scenario:?(1)顯示高級搜索頁面Given?打開百度首頁When?鼠標懸停在“設置”按鈕And?點擊設置菜單上的“高級搜索“按鈕Then?彈出高級搜索頁面Scenario:?(2)執(zhí)行高級搜索Given?輸入關鍵詞"My?IO"When?點擊高級搜索頁面上的“高級搜索"按鈕Then?搜索框顯示關鍵詞"My?IO"我們把一個需求分成2個連續(xù)的場景(Scenario),每個場景又有多個步驟。
5.生成Step文件
在Feature文件空白處點擊右鍵,選擇“Generate Step Definitions”菜單,在彈出窗口中設置class name為BaiduAdvancedSearchSteps,點擊“Generate”按鈕:?
生成的文件中已經(jīng)包含了對應描述文件的空方法:
可以看到,描述中用雙引號表示的搜索關鍵詞自動變成了參數(shù)。這樣就算調整相關描述,也無需修改代碼!
6.填充代碼
現(xiàn)在,我們可以按照方法描述填空,代碼可以來自于Playwright?的錄制功能:
完整代碼如下:
using?BoDi; using?Microsoft.Playwright; using?Microsoft.VisualStudio.TestTools.UnitTesting; using?System; using?System.Threading.Tasks; using?TechTalk.SpecFlow;namespace?SpecFlowProject1.Steps {[Binding]public?class?BaiduAdvancedSearchSteps{[BeforeFeature]public?static?async?Task?BeforeFeature(IObjectContainer?container){var?playwright?=?await?Playwright.CreateAsync();var?browser?=?await?playwright.Chromium.LaunchAsync(new()?{?Headless?=?false,?SlowMo=1000?});var?page?=?await?browser.NewPageAsync();container.RegisterInstanceAs<IPage>(page);}private?IPage?_page;public?BaiduAdvancedSearchSteps(IPage?page){this._page?=?page;}[Given(@"打開百度首頁")]public?async?Task?Given打開百度首頁(){await?_page.GotoAsync("https://www.baidu.com/");}[When(@"鼠標懸停在“設置”按鈕")]public?async?Task?When鼠標懸停在設置按鈕(){await?_page.WaitForSelectorAsync("#s-usersetting-top");await?_page.HoverAsync("#s-usersetting-top");}[When(@"點擊設置菜單上的“高級搜索“按鈕")]public?async?Task?When點擊設置菜單上的高級搜索按鈕(){await?_page.ClickAsync("a[href='//www.baidu.com/gaoji/advanced.html']");}[Then(@"彈出高級搜索頁面")]public?async?Task?Then彈出高級搜索頁面(){var?handle?=?await?_page.WaitForSelectorAsync(".bdlayer.s-isindex-wrap.new-pmd.pfpanel");var?style?=?await?handle.GetAttributeAsync("style");Assert.IsTrue(style.Contains("display:?block;"));}[Given(@"輸入關鍵詞""(.*)""")]public?async?Task?Given輸入關鍵詞(string?p0){await?_page.TypeAsync("input[name='q1']",?p0);}[When(@"點擊高級搜索頁面上的“高級搜索""按鈕")]public?async?Task?When點擊高級搜索頁面上的高級搜索按鈕(){_page?=?await?_page.RunAndWaitForPopupAsync(async?()?=>{?await?_page.ClickAsync(".advanced-search-btn");});}[Then(@"搜索框顯示關鍵詞""(.*)""")]public?async?Task?Then搜索框顯示關鍵詞(string?p0){var?handle?=?await?_page.WaitForSelectorAsync("#kw");var?text?=?await?handle.GetAttributeAsync("value");Assert.AreEqual(p0,?text);}} }7.執(zhí)行測試
選擇菜單“測試”->“運行所有測試”,可以看到所有測試運行通過:?
你還可以關閉瀏覽器無頭模式,用可視化的方式觀察測試是如何工作的:
結論
通過上面的示例。我們看到,Feature除了少數(shù)幾個簡單的英語單詞外,全部都可以用中文,沒有一行代碼!
完全可以由業(yè)務需求人員來編寫測試用例,同時可以保證大家都能夠理解,達成共識。
而測試代碼也是不言自明的,對后期維護非常有利。
還等什么,Playwright for .NET + SpecFlow,走你!
如果你覺得這篇文章對你有所啟發(fā),請關注我的個人公眾號”My IO“,記住我!
總結
以上是生活随笔為你收集整理的不会自动化UI测试?不会编程?没问题,会造句就行!的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 关于 .NET 与 JAVA 在 JIT
- 下一篇: dotNet 5 中执行 Node.js