不会自动化UI测试?不会编程?没问题,会造句就行!

上次,我们介绍了用于Web应用程序自动化测试的工具Playwright for .NET。

但是直接使用它来编写测试用例,代码比较凌乱,后期也不好维护。

因此,我们利用SpecFlow让测试用例更好理解和维护。

1.SpecFlow介绍

SpecFlow是.Net平台下用于行为驱动开发的开源框架。它使用普通人能够理解的的软件需求描述作为软件测试的基础,并可以将它们转换为可执行代码。

详细介绍可参看官网:https://specflow.org/

2.安装SpecFlow扩展

运行VS2019,选择菜单“扩展”->“管理扩展”,在打开的窗口在搜索“SpecFlow”:

点击“下载”按钮开始安装,重新启动VS完成安装。

3.创建SpecFlow项目

新建项目,选择“SpecFlow project”模板,点击“创建”按钮,在弹出的窗口中选择.NET框架和测试框架。这里我们选择MSTest作为测试框架:

点击“Create”按钮,最终生成的项目结构如下图: 

4.添加Feature文件

在解决方案资源管理器的Feature文件夹上点右键,添加"SpecFlow Feature File",命名为BaiduAdvancedSearch.feature

Feature是一个纯文本文件,它的作用是使用被称为Gherkin的语法,按照Given/When/Then的特定示例格式来编写软件需求描述。

执行百度高级搜索的操作的Feature描述如下:

Feature: 百度高级搜索所有场景必须顺序执行Scenario: (1)显示高级搜索页面Given 打开百度首页When 鼠标悬停在“设置”按钮And 点击设置菜单上的“高级搜索“按钮Then 弹出高级搜索页面Scenario: (2)执行高级搜索Given 输入关键词"My IO"When 点击高级搜索页面上的“高级搜索"按钮Then 搜索框显示关键词"My IO"

我们把一个需求分成2个连续的场景(Scenario),每个场景又有多个步骤。

5.生成Step文件

在Feature文件空白处点击右键,选择“Generate Step Definitions”菜单,在弹出窗口中设置class name为BaiduAdvancedSearchSteps,点击“Generate”按钮: 

生成的文件中已经包含了对应描述文件的空方法:

可以看到,描述中用双引号表示的搜索关键词自动变成了参数。这样就算调整相关描述,也无需修改代码!

6.填充代码

现在,我们可以按照方法描述填空,代码可以来自于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.执行测试

选择菜单“测试”->“运行所有测试”,可以看到所有测试运行通过: 

你还可以关闭浏览器无头模式,用可视化的方式观察测试是如何工作的:

//关闭浏览器无头模式,每步操作延迟1秒
var browser = await playwright.Chromium.LaunchAsync(new() { Headless = false, SlowMo=1000 });

结论

通过上面的示例。我们看到,Feature除了少数几个简单的英语单词外,全部都可以用中文,没有一行代码!

完全可以由业务需求人员来编写测试用例,同时可以保证大家都能够理解,达成共识。

而测试代码也是不言自明的,对后期维护非常有利。

还等什么,Playwright for .NET + SpecFlow,走你!

如果你觉得这篇文章对你有所启发,请关注我的个人公众号”My IO“,记住我!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/299753.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

鼠标手势识别 [Flash]

算法&#xff1a;演示&#xff1a;源代码&#xff1a;http://www.foxaweb.com/demos/mousegesture/mouse_gesture_v1_0.zip转载于:https://www.cnblogs.com/boringlamb/archive/2008/05/20/1203115.html

Java交流|面试最后一问:你有什么问题想问我吗?

尽管&#xff0c;我们之前做了这么多的面试准备&#xff0c;然而&#xff0c;最后这个90%可见的最后一问可能直接让你功亏一篑。这么厉害的最后一问&#xff1a;”你有什么问题想问我吗&#xff1f;“ 看似平淡无奇的问题&#xff0c;但是却蕴含着多方面的含义。这个问题表面上…

基于MapWinGis的开发探索(三)--改善缩放、渲染、显示文本

继续对MapWinGis进行研究探索&#xff0c;紧接上一篇文章。MapWinGis自身有很多功能&#xff0c;此篇主要也是基于其内在方法来写的。除了第二点显示文本是根据其源代码进行扩展的。原图:一、改善缩放功能上一版本放大缩小都必须点击下工具栏的放大、缩小。是鼠标处于缩放状态&…

T-SQL利用Row_Number函数实现分页

SQL: CREATE PROCEDURE PagingViewTest (currentPageIndex INT, --页序号pageSize INT, --页大小pageCount INT OUTPUT --返回值&#xff0c;总记录数 ) AS BEGIN--取总记录数 SELECT pageCountCOUNT(OrderID) FROM dbo.sale_Order; --利用CTE以提高执行效率 WITH Result AS (…

程序员没有女朋友的原因,我终于找到了!

全世界只有3.14 % 的人关注了青少年数学之旅程序员没有女朋友的原因▼程序员大脑里想的▼每天要学习太多语言&#xff0c;程序员太忙了▼女朋友 VS 编译器▼程序员sao起来&#xff0c;还需要女朋友吗&#xff1f;▼电脑才是程序员的女朋友▼互道晚安后&#xff0c;会不会偶遇在…

dotNet 5 中执行 Node.js

在低代码产品中为了扩展功能&#xff0c;我们在业务编排中会扩展代码块的功能&#xff0c;允许用户直接在界面中进行代码&#xff08;Node.js、 Python&#xff09;的编写&#xff0c;来实现取数或者赋值的一些功能。本文简单介绍下在 dotNET 5 中怎么样进行 Node.js 的调用以及…

为什么会有蟑螂这种反人类的动物出现?

全世界只有3.14 % 的人关注了青少年数学之旅相信很多人都听过南北蟑螂的故事&#xff0c;即使是一个可以打死老虎的北方人在南方蟑螂面前也会惊慌失措。除此之外&#xff0c;我们日常生活里和蟑螂的故事还有很多&#xff0c;比如&#xff1a;当你打开灯的时候&#xff0c;会有一…

Ajax使用初步

Ajax定义为“Asynchronous JavaScript XML”的简称&#xff0c;也就是异步的JavaScript和XML处理。从原理上看&#xff0c;主要是Ajax可以通过调用HttpRequest实现与服务器的异步通讯&#xff0c;并最终在网页中实现丰富友好的用户界面Ajax使用初步&#xff0c;配置步骤1.把Aj…

WPF 如何流畅地滚动ScrollViewer

WPF开发者QQ群&#xff1a; 340500857 | 微信群 -> 进入公众号主页 加入组织欢迎转发、分享、点赞、在看&#xff0c;谢谢~。 前言看了看原生UWP的ScrollViewer&#xff0c;滑动很流畅(例如 开始菜单)&#xff0c;但是WPF自带的ScrollViewer滚动十分生硬..突发奇想&#x…

10岁吊打职业教师的天才,仅用10篇论文称霸数学界160多年,40岁英年早逝却迄今无人超越...

全世界只有3.14 % 的人关注了青少年数学之旅今天超模君就给大家讲讲黎曼。人类历史上最伟大的数学天才的德国数学家是十九世纪数学界的巅峰——节选自《数学之旅 闪耀人类的54个数学家》1826年&#xff0c;黎曼作为家中的老二在德国汉诺威的布雷斯伦茨村出生了。他的父亲是村里…

面试可以,但别打扰我睡觉! | 今日最佳

全世界只有3.14 % 的人关注了青少年数学之旅&#xff08;图源科技九洲君&#xff0c;侵权删&#xff09;

基于事件驱动架构构建微服务第3部分:Presenters, Views和Controllers

原文链接&#xff1a;https://logcorner.com/building-microservices-through-event-driven-architecture-part3-presenters-views-and-controllers/在本文中&#xff0c;我将实现Presentation(展示层)。这里的展示层不是指用户界面而是Web API。也可以在实现展示层之前先实现r…

牛逼!不得不服,第一次有人把Java 反射机制讲解这么透!

反射概述 什么是反射 将类的各个组成部分封装为其他对象的过程就叫做 反射&#xff0c;其中 组成部分 指的是我们类的 成员变量&#xff08;Field&#xff09;、构造方法&#xff08;Constructor&#xff09;、成员方法&#xff08;Method&#xff09;。 使用反射的优缺点 …

拿破仑最欣赏的数学家,师从拉格朗日,撕逼泊松,一生痴迷热学最后却死于热学...

全世界只有3.14 % 的人关注了 青少年数学之旅 这几天&#xff0c;终于变凉了&#xff0c;超模君再也不用被热死了。 但炎热夏日的离去&#xff0c;也让超模君想起了那个和热脱不了关系的数学家——傅里叶。 “对自然界的深入研究是数学发现最丰富的源泉” ——节选自 《数学之旅…

记一次 .NET 某智慧水厂API 非托管内存泄漏分析

一&#xff1a;背景 1. 讲故事七月底的时候有位朋友在wx上找到我&#xff0c;说他的程序内存占用8G&#xff0c;托管才占用1.5G&#xff0c;询问剩下的内存哪里去了&#xff1f;截图如下&#xff1a;从求助内容看&#xff0c;这位朋友真的太客气了&#xff0c;动不动就谈钱&…

直接开撸! 阿里Spring高频面试题泄露,持续更新~

阿里HR面试核心的几个问题&#xff1a; 1、你为什么离职&#xff1f; 2、你怎么看待自己的职业生涯&#xff1f;&#xff08;包括怎么平衡家庭和工作的关系、加班、选择一家公司时的考量、location等&#xff09; 3、薪资期望 4、项目中遇到的最大挑战是什么&#xff1f;怎么…

重磅!Nature盘点年度十佳论文,生命科学占据半壁江山,中国学者表现亮眼

全世界只有3.14 % 的人关注了青少年数学之旅科学是人类进步的阶梯&#xff01;在当今社会&#xff0c;科学技术的发展进步将为人类社会带来巨大的效益&#xff0c;毫不夸张的说&#xff0c;科学指引并推着着人类文明的进程。基础科学作为科学技术的理论基石&#xff0c;其重要性…

zend guard6的使用

1.生成key edit->preferences->license Keys->generate 2.新建product license文件 3.新建Zend Guard项目文件 需要注意新建项目的第二项需要英文路径 4.在项目上按右键 选择configure 初始界面是 如果要用做授权,点击security按键 然后设置license文件等 附上php.in…

理解T-SQL: 脚本和批处理

脚本能够将相应的T-SQL命令组织起来&#xff0c;实现一个完整的功能目标。脚本提供了变量、分支、循环等控制语句&#xff0c;可以用来实现一些复杂的任务。通过组织一系列的SQL命令编成脚本和批处理&#xff0c;也减低了数据库管理的复杂性。 1. USE语句 没啥好讲的&#xff0…

凉凉!面试阿里我被Redis技术专题给搞的昏倒在地~

凉凉&#xff01;面试阿里我被Redis技术专题给弄死了~ &#x1f4da;我本以为我可以像是别的博主一样去阿里面试随随便便&#xff0c;因为Redis&#xff0c;我直接被阿里大佬淦翻在地上 好了不装了 没过没关系 我总结了一些这些最难的知识点&#xff01;&#xff01;&#xff0…