上一篇:搭建自己的前端自动化测试脚手架(二)
By LancerComet at 23:47, 2016.07.22. 欢迎转载,转载时还请保留作者署名。

这是最后一章了!(・∀・)
之前我们配置好了我们的脚手架工具,现在可以编写测试用例了!

开始编写测试用例

创建目录存放测试用例

在项目根目录新建一个名为 "tests" 的目录,然后这里就用来存放我们即将编写的测试用例文件。
那么这个文件夹能不能指向到其他地方去呢?当然可以,不过要修改一个小地方。

还记得 " nightwatch.json " 文件么?打开看看,第一项是不是叫 src_folders,然后值为 ["tests"]
我相信您已经懂了,这里就是定义测试用例存放目录的地方,然后改成自己想要的目录吧!

您可以在目录中存放多个测试用例文件,且命名随意,Nightwatch 将读取目录中所有的 JS 文件,如果符合测试用例格式,将会自动执行。

编写一个简单的测试用例

在 "tests" 目录中建立一个测试用例文件 "demo.js",然后我们来写一个没什么用的小 demo!

这个 Demo 将打开 Bing,搜索 "what is microsoft",然后保存成截图后退出。

OK,打开 "demo.js",添加以下内容:

module.exports = {'Find the answer.': function (client) {// TODO...}
}

module.exports 导出一个对象,对象的 Key 即为测试用例名称,您可以编写多个测试用例,Nightwatch 将依次执行。

您可以在测试用例中导入其他模块并直接使用在测试逻辑中,这也是比 Phantom.JS 优秀的地方。

先写到这里,您可能会对 cilent 感到陌生,所以还是要简单介绍一下。

client 是代码运行时 Nightwatch 提供的对象,所有对浏览器进行的操作都将使用此对象调取,比如 client.click("CSS Selector")client.getCookie(function () {...}),我们第一章说过的 "可以简单理解为 Selenium 的控制软件" 就是通过它体现的喔!

client 的所有 API 详情见 这里。

大致了解这东西的意思之后,就可以接着完善测试逻辑了:

module.exports = {'Find the answer.': function (client) {// 定义 Bing 页面中的节点.const searchInput = '#sb_form_q'const searchBtn = '#sb_form_go'const question = 'what is microsoft'// 启动浏览器并打开 bing.com.client.url('http://bing.com').maximizeWindow()// 确保 "body" 和输入框可以使用.client.expect.element('body').to.be.presentclient.expect.element(searchInput).to.be.visibleclient.pause(2000)  // 稍等两秒.// 输入 "what is microsoft" 然后搜索.client.setValue(searchInput, question)client.click(searchBtn)client.pause(2000)// 截一张图然后保存到 "reports/answer.png". client.expect.element('body').to.be.presentclient.saveScreenshot('reports/answers.png')client.end()}
}

来关注一下 expect ,是不是看起来很像自然语言?这些语句就是测试结果的验证语句,就是我们希望得到的结果。比如 client.expect.element('body').to.be.present.before(3000),意思就是 "希望 body 元素能在 3000 毫秒内初始化完毕"。

Nightwatch 支持 BDD-Style 与 Assert 断言两种风格,文档可见 这里。

关于 Assert、BDD、TDD 的更多内容请参照其他文章。

是不是确实没什么用?毕竟是个简单的 Demo 而已,哈哈。
那么添加一个稍微复杂点的测试用例。

编写另一个简单的测试用例

这个 demo 将打开 Bilibili 直播 ,然后执行:

  • 打开首页并等待加载完毕;

  • 检查登陆按钮是否存在;

  • 点击登陆按钮;

  • 填写用户名与密码;

  • 点击登陆;

  • 等待页面加载;

  • 通过 Cookie 检查是否已登陆;

  • 确保登陆后的用户导航面板存在;

  • 鼠标移至头像处打开导航面板;

  • 点击退出登陆;

  • 等待页面刷新后检查 Cookie 是否已退出登陆;

  • 结束测试。

其实就是第一章的那个 Demo 图干的事情了 (・∀・)
这个 demo 不再啰嗦,直接放出代码:

// Account setting.
const accountConfig = {username: 'USERNAME',password: 'PASSWORD',uid: '10000'
}module.exports = {'Bilibili Live Login Test': function (client) {client.url('http://live.bilibili.com').maximizeWindow()// Page Init.client.expect.element('body').to.be.present.before(3000)client.expect.element('.top-nav-login-btn.last').to.be.visible// Login.client.click('.top-nav-login-btn.last')client.waitForElementVisible('#bilibili-quick-login', 2000)client.frame(0)client.pause(2000)client.setValue('#login-username', accountConfig.username)client.setValue('#login-passwd', accountConfig.password)client.click('#login-submit')// Wait and check page has been reloaded.client.frameParent()client.pause(4000)client.expect.element('body').to.be.present.before(3000)// Check cookies to ensure we are signed in.client.getCookies(function (result) {result.value.forEach((value, index, array) => {if (value.name === 'DedeUserID') client.assert.equal(parseInt(value.value, 10), accountConfig.uid)})})// Move to User Avatar.client.expect.element('.user-avatar-link').to.be.visibleclient.moveToElement('.user-avatar-link', 5, 5)client.pause(800)client.expect.element('#top-nav-user-panel').to.be.visible// Logout.client.click('#top-nav-logout-link')client.pause(5000)client.expect.element('body').to.be.present.before(3000)// Check cookies again to ensure we are off.client.getCookies(function (result) {var logout = trueresult.value.forEach((value, index, array) => {if (value.name === 'LIVE_LOGIN_DATA') logout = false})client.assert.equal(logout, true)})client.pause(1000)client.end()}
}

您可以新建一个文件,或者在之前的文件中继续编写。

运行测试用例

回到项目根目录,执行 npm start,然后就可以看到浏览器自己测试了!
运行效果如下:

测试运行完毕之后,测试结果将打印在终端里,同时会生成到 reports 文件夹中。

您可以在 nightwatch.json 中修改 "output_folder" 来更换报告生成目录。

需要注意的地方

您可能在使用中会遇到例如 “明明看到节点缺获取不到”、“鼠标功能好像时好时坏” 等问题,在此给您一些建议:

  • 由于现在很多网站使用诸如 Angular、Vue 等框架构建,其节点可能为组件动态渲染,所以 Selenium 在执行测试时可能获取的 Dom 树为旧数据从而导致找不到节点,因此您可以执行等待语句确保节点出现后再进行测试。不过可能不是 100% 成功,这也是这套测试系统的短板之一。

  • 如果您在进行模拟鼠标的测试,您的鼠标指针可能会干扰您的测试,因此建议运行测试后将您的指针移动至屏幕外部,以避免干扰到浏览器测试。

  • 测试很可能因为页面加载时间问题导致测试失败,不过这也是 E2E 测试的特征所在,您可以修改您的测试逻辑,或致力缩短加载时间。

大功告成!

现在您已经拥有您自己的测试工具并且成功编写了两个测试用例!此处您应该为自己鼓掌!
您现在已经可以将 E2E 测试纳入您的开发流程之中,在下相信这将对您的开发有不小的帮助。如果您有兴趣,您也可以考虑 单元测试 的可能性。

如果您没能成功构建您的项目,您可以从这里获取代码。

同时像之前提到的,如果您在使用 Vue 构建您的项目,您可以使用 Vue-cli 来生成已经包含 Selenium 与 Nightwatch 的 Vue 种子项目,您可以在 test/e2e 中编写您的测试用例。

希望三篇简单的短文能给您带来帮助!⁄(⁄ ⁄•⁄ω⁄•⁄ ⁄)⁄

搭建自己的前端自动化测试脚手架(三)相关推荐

  1. 搭建自己的前端自动化测试脚手架(一)

    搭建自己的前端自动化测试脚手架(一) LancerComet at 17:55, 2016.07.17. 欢迎转载,转载时还请保留作者署名. 随着前端项目规模的日益膨胀,自动化测试越来越受到广大前端与 ...

  2. 一文,教你搭建前端自动化测试环境

    前言 最近在看前端自动化测试相关的东西,在搭建环境的时候发现还是有许多需要注意的地方,而且网上很少有将各种测试(单元测试,集成测试,端对端测试)的环境搭建都提及的文章,对像我这样的新手不太友好,于是便 ...

  3. 前端自动化测试jest

    文章目录 持续集成和前端自动化测试 前端自动化分类 TDD (Test-Driven Development) 测试驱动开发 BDD (Behavior Driven Development) 行为驱 ...

  4. Grunt搭建自动化web前端开发环境--完整流程

    jQuery在使用grunt,bootstrap在使用grunt,百度UEditor在使用grunt,你没有理由不学.不用! 1. 前言 各位web前端开发人员,如果你现在还不知道grunt或者听说过 ...

  5. 如何进行前端自动化测试?

    转自专栏: [从入门到不放弃]多浏览器的自动化测试(1)-本地测试 - 知乎专栏 [从入门到不放弃]多浏览器的自动化测试(2)-云服务测试 前端之殇 要是你碰到前端工程师朋友,那聊聊浏览器的兼容性准是 ...

  6. Node + ts + puppeteer e2e前端自动化测试

    前言: 此文先在其他平台发表,如有雷同,有可能那个也是我~ 先了解一下概念 自动化测试的类型及工具都有挺多:单元测试.集成测试.UI测试.e2e测试等等,相关概念网上有挺多文章介绍了,就不多聊,比如这 ...

  7. 前端自动化测试工具:SlimerJS、phantomJS 和 CasperJS

    对于富客户端的 Web 应用页面,自动登录.页面修改.抓取页面内容.屏幕截图.页面功能测试-面对这些需求,使用后端语言需要花费不少的精力才能实现.此时 SlimerJS.phantomJS 或 Cas ...

  8. 从0到1搭建移动App功能自动化测试平台(2):操作iOS应用的控件

    转载:http://debugtalk.com/post/build-app-automated-test-platform-from-0-to-1-Appium-interrogate-iOS-UI ...

  9. 前端工程师的三种级别,技术决定你能拿5K,还是15K,还是25K

    随着信息技术不断发展,前端技术的发展也经历了不同的阶段.前端概念随着移动智能手机的普及被正式提出,混合APP开始被广泛开发.近年来,由于前端技术开始实现工程化,一些企业前端开发任务逐渐向后端拓展,逻辑 ...

最新文章

  1. Android studio | From Zero To One ——简单布局(View和LinearLayout)
  2. Kotlin 4 构造,对象,修饰符,关键字,委托
  3. 1005. 继续(3n+1)猜想 (25)
  4. jdk 1.8 java.policy,JDK1.8 导致系统报错:java.security.InvalidKeyException:illegal Key Size
  5. vue引入全局less实现全局变量的控制
  6. css 小知识点:inline/inline-block/line-height
  7. CSS3否定伪类选择器
  8. 云+社区「开源之道」主题直播,这些技术大佬都说了哪些干货?
  9. Yaml spring boot 二维数组写法
  10. vyos v1.2安装flask
  11. win11删除快捷方式的小箭头.bat
  12. canvas贝塞尔曲线爱心_贝塞尔曲线之爱心点赞代码全解析!| CSDN 博文精选
  13. 视频 | 计算万物的理论
  14. 解决微信小程序IOS中使用picker弹出内容和手机软键盘重叠的问题
  15. 华为打造的智慧办公“新物种”,为何在央视节目露脸?
  16. #9733;思维导图的30个问答
  17. 关于jmeter中编写shell脚本json的应用
  18. 感悟信息安全之道——温水煮青蛙
  19. 基于MFC的桌面时钟应用程序
  20. 安装包制作工具 Inno Setup 6.0.2 汉化版-BY 胡萝卜周博客

热门文章

  1. centos7-yum安装与卸载
  2. 《剑指Offer》题一~题十
  3. 实验吧---隐写术之男神一般都是很低调的!
  4. 《OpenGL编程指南》一第2章 着色器基础
  5. 新口令范筹(Token Scope)- viewables:read
  6. dede 怎样调用其它栏目的文章或者缩略图列表且有分页效果?
  7. 创业星光论坛(上):汇源是否应在万荣建厂
  8. MAC Opencv include选择
  9. MAC能登录微信,浏览器连不上网
  10. char[],char *,string之间转换