[小北De编程手记] Lesson 01 - AutoFramework构建 之 从一个简单的Demo聊起
写在最前面
这个系列的主旨是要跟大家分享一下关于自动化测试框架的构建的一些心得。这几年,做了一些自动化测试框架以及团队的构建的工作。过程中遇到了很多这样的同学,他们在学习了某一门语言和一些自动化测试的类库或者工具之后,打算进一步的提高。我想这个系列也许会帮助到你,我们一起从各个维度来看一看自动化测试框架的一些最佳实践。本人能力有限,如果有什么不正确的的地方还各位大牛指正。
聊聊自动化测试的初心
在开始具体的技术和理论之前,我们先来思考一下自动化测试的目的是什么?我简单的罗列了几点:
- 替代手工测试中的重复操作,让测试人员把时间花在更有价值的地方
- 降低自动化测试用例编写的技术门槛,即尽可能降低学习成本,提高工作效率
- 提高测试效率,在软件开发生命周期的各个环节为质量保驾护航
- 精准的数据统计和分析,对产品质量和团队效能提供数据支持
以上这几点算是我们构建自动化测试的一些原因,在一开始聊这些是希望小伙伴们不要在构建框架的过程中时刻记得我们的宗旨。勿忘初心,方得始终嘛~~~(其实,很多失败的自动化框架就是在实践的过程中渐渐违背了上述的这些目标)
从一个测试用例开始
上来就谈论技术选型,工具类库的选择,设计模式,生命周期这些概念也许会让你迷茫。一个实实在在的测试用例也许是会是好的开始。希望能让你先有一个感官的认识,后面的文章我们会一步步由浅入深的刨析这个Demo Case.
下面这个Demo使用的是C#语言和单元测试xUnit.Net框架。如果对xUnit.Net还不是很熟悉的的同学,建议可以先看看我的另一个系列《玩转xUnit.Net》,对于这个CASE而言了解单元测试的基本使用即可。
namespace AutoFramework.TestCase
{
public class TestSuite_Demo : TestBase
{
public TestSuite_Demo(TestContextFixture context, ServiceFixture service, DBFixture database)
: base(context, service, database) { } [Fact(DisplayName = "TestCase.Demo001")]
public void Demo_Case_CreateCamp()
{
//-->Data preparation.
var userModel = ModelBuilder.ForJsonFile<UserModel>("DemoCase/TestData.json"); //-->Test case exec way 01.
var signInPage = Router.GoTo<SignInPage>();
var homePage = signInPage.SignIn("user-name", "pwd");
var addUserPage = homePage.NavMenu.Select<AddUserPage>("User", "New");
var userListPage = addUserPage.AddUser(userModel); //-->Test case exec way 02.
/*You can custom this 'Workflow'*/
var userListPage = Router.GoTo<SignInPage>()
.SignIn("user-name", "pwd")
.NavMenu.Select<AddUserPage>("User", "New")
.AddUser(userModel); Assert.True(userListPage.IsExistUser(userModel.Name)); //more
//this.Service.CallSomeService(someModel);
//this.Database.ExecSomeAction(someModel);
}
}
}
我在《Lesson 08 - Selenium For C# 之 PageFactory & 团队构建》一文中,提到过自动化测试团队的组成,而上面的Demo是基于一个成熟的框架(也就是这个系列文章所要带你一步步构建的测试框架),所编写的最顶层的测试用例。
首先思考一下这个问题,一个Web手工测试测试人员是如何来完成测试工作的:
- 测试用例执行前的数据准备
- 一个可以工作的浏览器,自由的导航到不同的页面
- 在不同的页面上进行的操作
- 检查页面上的测试点(Check Point)
- 检查数据库中的数据
- 检查特定服务返回的数据
那么,结合上面的测试用例Demo,我们来总结一下,将要实现的自动化测试框架应该为普通的用例编写人员提供哪些的功能:
- 从外部文件中获取测试数据的能力(ModelBuilder.ForJsonFile)
- 控制路由的对象Router,协助测试人员进行页面导航以及PageObject对象的获取。
- 用来描述页面功能的PageObject对象。
- 调用系统服务的Service对象。
- 进行数据库访问的数据库对象。
Note:当然,测试框架应当提供的功能远不止这些。
读到这里,也许有些同学会有很多的疑问。Model是什么?Router是如何实现的?PageObject应该如何封装?Service 和 Database对象是怎么实现的?等等... ... 这些问题也是这个系列的文章想要跟大家分享的,后面的文章我会逐一跟大家讨论。在这里我们还是把关注点放在这个case上面,在之前列出来的那些Router,PageObject,Model,Service对象和数据库访问对象都能正常工作的前提下,编写自动化用例的人员是不是就可以很容易的完成测试用例的编写?细心的同学也许已经发现了,这个case似乎没有涉及到UI驱动的框架(比如:Selenium、Appnium、White...),我也没有说这个自动化测试测试的是一个什么样的项目。但是,通过这段代码:
//-->Test case exec way 01.
var signInPage = Router.GoTo<SignInPage>();
var homePage = signInPage.SignIn("user-name", "pwd");
var addUserPage = homePage.NavMenu.Select<AddUserPage>("User", "New");
var userListPage = addUserPage.AddUser(userModel);
你是不是已经能大致的明白这个用例是做什么的呢?
如果为你提供了所有对象的方法列表,你是不是也可以高效快速的完成其他的测试用例呢?回想一下我们构建自动化测试框架的初心。如果要测试人员可以像做手工测试一样书写自动化测试用例,是不是就做到了降低测试门槛的目的呢?这里用到了自动化测试的一个常见的设计模式-PageObject。接下来的几篇文章我们会针对这个模式进行讲解。
看看我们将要构建的框架
任何一个框架都是一系列复杂组件的协作。我们将要一起构建的自动化测试框架会拥有下列的一些组件:
- 管理页面路由的工具:Router
- 服务调用工具:ServiceInvoker
- 数据库访问工具:DataKeeper
- 针对PageObject模式
- Action封装
- CheckPoint封装
- Component封装
- 异常处理工具
- 日志管理工具
这一篇就先到这里啦~~,自动化测试框架的构建是需要一定知识基础和自动化测试经验的。希望我们能在接下来的这段时间里一起提高,同样也希望我的观点对你有所启发和帮助~~~
小北De系列文章:
《[小北De编程手记] : Selenium For C# 教程》
《[小北De编程手记]:玩转 xUnit.Net》(未完成)
[小北De编程手记] Lesson 01 - AutoFramework构建 之 从一个简单的Demo聊起的更多相关文章
- [小北De编程手记] [Lesson 02] AutoFramework构建 之 Page Objects - 设计模式
写在最前面 这个系列的主旨是要跟大家分享一下关于自动化测试框架的构建的一些心得.这几年,做了一些自动化测试框架以及团队的构建的工作.过程中遇到了很多这样的同学,他们在学习了某一门语言和一些自动化测试的 ...
- [小北De编程手记] : Lesson 01 玩转 xUnit.Net 之 概述
谈到单元测试,任何一个开发或是测试人员都不会觉得陌生.我想大多数的同学也都是接触过各种单元测试框架.关于单元测试的重要性,应该不会有太多的质疑.这个系列,我向大家介绍一下xUnit.Net的使用.就让 ...
- [小北De编程手记] : Lesson 01 - Selenium For C# 之 环境搭建
在我看来一个自动化测试平台的构建,是一种很好的了解开发语言,单元测试框架,自动化测试驱动,设计模式等等等的途径.因此,在下选择了自动化测试的这个话题来和大家分享一下本人关于软件开发和自动化测试的认识. ...
- [小北De编程手记] : Lesson 04 玩转 xUnit.Net 之 Fixture(下)
上一篇文章<[小北De编程手记] : Lesson 03 玩转 xUnit.Net 之 Fixture(上)>向大家介绍了xUnit.Net 共享数据的方式.Test Case的构造函数 ...
- [小北De编程手记] : Lesson 08 - Selenium For C# 之 PageFactory & 团队构建
本文想跟大家分享的是Selenium对PageObject模式的支持和自动化测试团队的构建.<Selenium For C#>系列的文章写到这里已经接近尾声了,如果之前的文章你是一篇篇的读 ...
- [小北De编程手记] : Lesson 07 - Selenium For C# 之 窗口处理
在实际的自动化测试过程中,我们会遇见许多需要对窗口进行处理的情况.比如,点击删除某条信息的时候系统会显示一个Alert框.或者点击某个超链接时会在浏览器中打开一个新的页面.这一篇,来和大家分享一下Se ...
- [小北De编程手记] : Lesson 06 - Selenium For C# 之 流程控制
无论你是用哪一种自动化测试的驱动框架,当我们构建一个复杂应用程序的自动化测试的时候.都希望构建一个测试流程稳定,维护成本较低的自动化测试.但是,现实往往没有理想丰满.而这一篇,我会为大家讲解我们在使用 ...
- [小北De编程手记] : Lesson 02 - Selenium For C# 之 核心对象
从这一篇开始,开始正式的介绍Selenium 以及相关的组件,本文的将讨论如下问题: Selenium基本的概念以及在企业化测试框架中的位置 Selenium核心对象(浏览器驱动) Web Drive ...
- [小北De编程手记] : Lesson 03 - Selenium For C# 之 元素定位
无论哪一种自动化测试的驱动框架(基于B/S,桌面应用,还是手机App).都应当具有一套优秀的元素定位技术.通常的自动化测试流程也可以简单的归结为是一个从被测试程序中识别或是定位元素以及执行操作和验证元 ...
随机推荐
- Python的多线程编程
提到多线程,很多人就会望而却步,本文将由浅入深地带你攻克python多线程编程,并防止你跳入深坑, 首先看一段简单的代码: from time import ctime,sleep def play_ ...
- .Net上传文件大小配置
1.起因 今天同事在上传文件的时候,发现一直失败,说文件比较大.一听就明白了,肯定是上传文件大小的问题啊.然后查看web.config文件,发现设置过文件上传的大小限制.配置文件上传大小,分为2部分. ...
- 使用Iterator的方式也可以顺利删除和遍历
使用Iterator的方式也可以顺利删除和遍历 eg: public void iteratorRemove() { List<Student> students = this.getSt ...
- 简单的视频采集demo
打算做个简单的聊天软件,其中一个我没做过的,就是视频采集. 在网上查了许久资料,终于搞清楚了dshow采集视频的流程 参考资料如下: https://msdn.microsoft.com/en-us/ ...
- workday1
前天是实习的第一天,现在补下感想 总的来说还是不错的,师兄很nice,师妹很羞涩,我很尴尬,我的交际能力还是有待提高(主要是普通话不标准~~~~(>_<)~~~~) 早上由华工C12穿梭到 ...
- 【PHP】最详细PHP从入门到精通(五)——PHP错误处理
PHP从入门到精通 之PHP中的字符串 在创建脚本和 web 应用程序时,错误处理是一个重要的部分.如果您的代码缺少错误检测编码,那么程序看上去很不专业,也为安全风险敞开了大门. 本教程介绍了 PH ...
- 解决CentOS7中文乱码(包括Tomcat日志乱码)问题
Linux系统中文语言乱码,是很多小伙伴在开始接触Linux时经常遇到的问题,而且当我们将已在Wndows部署好的项目搬到Linux上运行,Tomcat的输出日志中文全为乱码(在Windows上正常) ...
- Bash : 索引数组
Bash 提供了两种类型的数组,分别是索引数组(indexed array)和关联数组(associative array).本文主要介绍索引数组的基本用法. 索引数组的基本特点 Bash 提供的数组 ...
- 标准IO: 文件的打开与关闭函数 fopen & fclose
(1) 流(stream)和文件(file) 流和文件 在Turbo C2.0中是有区别的, Turbo C2.0 为编程者和被访问的设备之间提供了一层抽象的东西, 称之为"流&quo ...
- 字符串(String)
字符串 字符串就是用引号引起来的一段文字.字母.数字-- 例如: "这是字符串"."zheshizifuc"."6666" 使用字符串的方法 ...