利用F#库canopy进行UI测试

虽然Selenium是一个流行的UI测试库,但基于它创建的测试却有着脆弱不可靠等常见的问题。InfoQ与canopy的作者Chris Holt进行了一次访谈,以便更深入地了解canopy这个在Selenium的基础上所创建的F#库。

InfoQ:你能否为我们介绍一下canopy?

Chris Holt:canopy是基于Selenium之上,以F#实现的一层功能,它的目标是使UI测试的行为符合使用者的预期。Selenium虽然表现很出色,但有时会显得过于刻板。在canopy中,所有行为不再会因为无法点击某个元素而立即报错,而是不断地尝试点击某个元素,直至一段合理的时间后仍无法点击才会报错。这将帮助你创建更可靠的测试,而不是往往只在第一次尝试时成功的测试。

InfoQ:canopy如何简化通过Selenium进行UI测试的过程?

CH:canopy内置了重试功能,包括元素的获取以及用户在屏幕上的行为,也包括验证功能。此外,canopy还可以通过实用的错误信息帮助用户修复一些常见的问题,例如某个选择器的拼写错误。它还支持以多种方式选择元素,并且易于对这些功能进行扩展。

举例来说,如果用户的屏幕上有一个显示“Save”文字的按钮,那么只需要在代码中写为click "Save",就可以实现单击的目的。而在常规的Selenium代码中,用户必须在ByText、ById、ByCSS、ByXPath等方法中进行选择。如果要扩展这一功能,只需为用户网页的惯用方式添加对应的finder实现,例如在表单数据中的placeholder值,或是为了表示元数据而人为定义的data-*标签。

canopy还提供了一套简明的API,让用户更方便地阅读与编写测试。它还能够克服html中的各种区别。比方说,每种输入类型在html中都有着不同的表现方式,因此通过原始的Selenium操作他们的方式也是不同的。而在canopy中,操作方式都是相同的。举例来说:

// Assign a value to a textbox or dropdown
"#state" << "New York"

InfoQ:canopy是否支持与外部自动化服务的集成,例如Browserstack?

CH:是的,只要是Selenium支持的功能,canopy也同样支持。为了支持Browserstack,用户需要使用RemoteWebdriver。由于canopy本身内置了大量的重试功能,因此交互的次数将有所增加。不过,因为用户不必经常调用Sleep,因此这种增加的交互是可以接受的。canopy还提供了大量可选的优化方式,如果你打算具体地表述选择器的类型,而不是让canopy分析你的选择器类型,就可以应用这些优化。

InfoQ:在页面中选择元素有没有推荐的做法?比方说,通过id选择元素是否会为测试带来更好的可维护性与健壮性?

CH:在UI自动化中所用到的多数“技巧”都与选择元素相关。至于是应该使用整洁的选择器,还是必须要在标签中加入class或id等属性,这两者之间需要找到一个平衡点。我认为,CSS与JQuery选择器的语法是最优秀的,用户可以在80-90%的场景中使用这种方式。而在其余10%-20%的场景中可以使用XPath。在进行准确的文字匹配或是找到某个元素的父元素时需要用到XPath。而通过值或内部文字进行查找也是非常方便的做法,假如上文所述的click "Save"这个示例,它的内部实现就用到了XPath。

经过一段时间的实践之后,用户就可以熟练地掌握创建选择器的方法了,工建议用户通过实践进行学习,而不是通过某种工具去生成选择器。这种方式更准确,并且当页面结构发生变化而影响了用户的测试时,它也更容易进行修正。一旦用户对于选择器有了一定的心得体会之后,用户就会懂得如何让html代码更易于维护,从而简化了选择器的创建。

选择器的编写可以通过某些方式让人更易于理解,例如#header .links这个选择器就表示在页面的header这个div中所有的links元素。而在自动生成的XPath中,它或许会变成html/body/div/div/div[2]/ul/li/a这种形式,这对于理解它的意义毫无帮助。而且如果一旦在这条选择链中多加了或是删除了某个div,就会使选择器无法工作。通过CSS方式编写的选择器“永远”都是有效的,除非有人改动了header这个id,或者删除/改变了links这个class。

InfoQ:用户是否可以自定义错误报告?比方说,我们是否能够在测试失败时自动截屏呢?

CH:canopy目前内置了3种reporter实现,即ConsoleReporter、TeamCityReporter和HtmlReporter。如果用户需要新增一个自定义的功能,只需简单地实现IReporter这个接口就行了。

InfoQ:有哪些方法能够扩展canopy的功能?

1)通过实现IReporter接口,自定义测试结果的输出

2) 在canopy所使用的finder集合中添加新的通用finder实现,以帮助用户找到页面元素。

3) 为用户常用的action添加新的函数。由于F#会运行某个函数最新定义的版本,因此用户还能够“重写”现有的函数,以满足自身的需求。

比方说,用户可以实现自定义的“click”功能,只需创建一个模块,例如“canopyExtensions”,并在“打开canopy”操作后“打开”这一模块,将所有扩展方法与重写的方法定义在其中。这样一来,所有测试都会调用由用户所定义的功能,而无需改动任何现有的功能。

这个示例表现的是某人希望能够在多选框中实现对元素的Ctrl+Click操作。由于canopy本身不具备这一特性,因此作者编写了一段扩展方法。

4) canopy并没有隐藏任何Selenium中的特性,或是对其进行抽象化。它只是使用了IWebDriver与IWebElement接口。用户在Stack      
overflow网站上看到的各种问题与回复对canopy都是100%有效的。用户所要做的唯一一件事就是将代码转换为F#。

InfoQ:在持续集成(CI)服务器上运行canopy测试需要经过哪些步骤?

CH:测试的运行方式是执行由构建过程所生成的控制台应用。测试结果支持不同的输出格式。支持TeamCity的配置过程只需一行代码:

reporter <- new TeamCityReporter() :> IReporter

我个人会选择使用一些简单的任务来实现整个构建过程,因此我在TeamCity中创建的任务都是很简单的,例如从源代码控制系统中获取最新代码,随后通过一个命令行语句启动我的任务,并完成其余工作。

在Jenkins环境中,我会选用HtmlReporter,通过一个Jenkins的插件生成html文档,并保存到整个任务的结果中。这同样也可以通过简短的几行代码完成设置工作。

canopy是一个托管在GitHub上的开源项目。如果读者有兴趣了解对它的更多介绍,可以观看Chris Holt最近在fsharpConf大会上关于canopy的演讲


相关文章

  • Selenium For C# 教程

  • 使用Selenium测试时必需知道的7件事


原文地址:http://www.infoq.com/cn/news/2016/03/canopy-ui-testing


.NET社区新闻,深度好文,微信中搜索dotNET跨平台或扫描二维码关注


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

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

相关文章

转: Springboot — 用更优雅的方式发HTTP请求(RestTemplate详解)

转自&#xff1a; Springboot — 用更优雅的方式发HTTP请求(RestTemplate详解) - Java知音号 - 博客园RestTemplate是Spring提供的用于访问Rest服务的客户端&#xff0c;RestTemplate提供了多种便捷访问远程Http服务的方法,能够大大提高客户端的编写效率。 我之前的HTTP开发是…

SpringBoot整合Shiro权限框架

前言 在系统管理中&#xff0c;权限是非常重要的一个环节。目前权限框架中使用比较多的有Shiro、Spring Security。&#x1f383; 本篇简单写一下SpringBoot整合Shiro权限框架小栗子&#x1f330;。 个人博客地址&#xff1a;SpringBoot整合Shiro权限框架 介绍Shiro Apache S…

Java开发必须掌握的8种网站攻防技术

转载自 Java开发必须掌握的8种网站攻防技术 XSS攻击 XSS攻击的全称是跨站脚本攻击(Cross Site Scripting),是WEB应用程序中最常见到的攻击手段之一。跨站脚本攻击指的是攻击者在网页中嵌入恶意脚本程序, 当用户打开该网页时,脚本程序便开始在客户端的浏览器上执行,以盗取客户端…

转:json与map互转

转自&#xff1a; java中字符串&#xff0c;json&#xff0c;Map互相转换&#xff08;各种转换都有&#xff09;_蜗牛驿站-CSDN博客_java json转map前提&#xff1a;使用jar包为fastjsonimport com.alibaba.fastjson.JSON;import com.alibaba.fastjson.JSONObject; 程序如下: …

专属微信二维码python制作_如何利用Python制作简单的公众号二维码关注图

创意配图&#xff1a;微信&#xff0c;微信公众号&#xff0c;微信大V 而且最近发现了一个新的图像处理方面的库—Wand&#xff0c;它是 ImageMagick 库的 Python 接口。于是&#xff0c;我就打算用这个库来实现简单的制作一个二维码关注图&#xff0c;主要是完成以下几个工作&…

如何迁移#SNMP到.NET Core平台的一些体会

.NET Core 依然在飞速进化中&#xff0c;所以如果不是非常喜欢折腾的性格&#xff0c;建议各位还是暂时忍耐。 准备阶段 首先&#xff0c;Visual Studio 2015是必要的开发工具。虽然它已经包含了.NET Core的原始测试版&#xff0c;这里还是推荐下载 RC1 安装包&#xff0c; htt…

JAVA实现一个图片上传预览功能

这个小项目主要使用java实现了一个简单的图片上传预览功能&#xff0c;废话不多说&#xff0c;先上实现成果 ^ _ ^&#x1f4af; 预览 登录页 主页 上传页 图片预览 项目架构 后端: SpringBoot shiro mybatis-plus druid hutool 前端: layui viewer 项目结构 ├─src├…

小程序执行运行过程原理_PLC的基础小知识!不用把PLC想的太难

PLC实质上是工业计算机&#xff0c;是计算机技术与传统继电接触器控制器技术相结合的产物&#xff0c;只不过比一般的计算机具有更强的与工业过程相连接的接口和更直接的适用于工业控制要求的编程语言。一、PLC的结构从硬件结构上看&#xff0c;PLC主要由中央处理单元(CPU)、存…

内部局域网可自行分配的ip地址

【1】有些ip地址很特殊 以 10. 、 172.16. 、172.31. 、192.168. 开头的所有ipv4地址都未分配。 更确切的说&#xff0c;这些地址不会被 ISP&#xff08;Internet服务提供商&#xff09;分配给广域网上的计算机&#xff0c;即无法加入全球Internet网络-广域网&#xff1b; 但…

以吃货的角度理解 IaaS,PaaS,SaaS 是什么

转载自 以吃货的角度理解 IaaS&#xff0c;PaaS&#xff0c;SaaS 是什么随着云计算时代的到来&#xff0c;越来越多的软件&#xff0c;开始采用云服务。越来越多的概念也随之而来。云服务只是一个统称&#xff0c;可以分成三大类。IaaS&#xff1a;基础设施服务&#xff0c;Inf…

.Net使用RabbitMQ详解

序言 这几天呢&#xff0c;公司风波再起&#xff0c;去年一年公司CTO换啦4任&#xff0c;CEO换啦三个&#xff0c;这不刚来个新老大&#xff0c;感觉还不错&#xff0c;却没干过3个月又要走&#xff0c;索性趁老大们走来走去的时候&#xff0c;就给自己空出来&#xff0c;稍稍总…

SpringBoot整合Redis要注意的那些

前言 昨天自己在重新学习SpringBoot整合Redis时&#xff0c;遇到了一个问题java.lang.NoClassDefFoundError: org/apache/commons/pool2/impl/GenericObjectPoolConfig&#xff0c;错误很明显找不到需要的类。下面主要记录一下错误是怎么出线的&#xff0c;并且如何解决。 错…

Java之Socket与HTTP区别

转自&#xff1a; Java之Socket与HTTP区别 - 曹刚 - 博客园我们都知道TCP/IP协议共分四层&#xff1a;①链路层&#xff0c;有时也称作数据链路层或网络接口层&#xff0c;通常包括操作系统中的设备驱动程序和计算机中对应的网络接口卡。它们一起处理与电缆&#xff08;或其他…

人人都能掌握的Java服务端性能优化方案

转载自 人人都能掌握的Java服务端性能优化方案 作为一个Java后端开发&#xff0c;我们写出的大部分代码都决定着用户的使用体验。如果我们的代码性能不好&#xff0c;那么用户在访问我们的网站时就要浪费一些时间等待服务器的响应。这就可能导致用户投诉甚至用户的流失。 关于性…

python模板模式_python-模板方法模式

说明&#xff1a; 模板方法模式时行为模式中比较简单的设计模式之一。模板方法关注这样的一类行为&#xff1a;该类行为在执行过程中拥有大致相同的动作次序&#xff0c;只是动作在实现的具体细节上有所差异。例如&#xff1a;泡茶和泡咖啡&#xff0c;泡茶&#xff1a;把水煮沸…

nacos启动失败:org.springframework.boot.web.server.WebServerExceptio

准备环境 系统环境: windows nacos: 2.0.0-BETA 错误信息 org.springframework.context.ApplicationContextException: Unable to start web server; nested exception is org.springframework.boot.web.server.WebServerException: Unable to start embedded Tomcat 配置文件…

post使用form-data和x-www-form-urlencoded的本质区别

转自&#xff1a; post使用form-data和x-www-form-urlencoded的本质区别_null-CSDN博客一是数据包格式的区别&#xff0c;二是数据包中非ANSCII字符怎么编码&#xff0c;是百分号转码发送还是直接发送一、application/x-www-form-urlencoded1、它是post的默认格式&#xff0c;…

使用Nancy打造TaskManager2.0管理系统

上一篇开源任务管理平台TaskManager介绍发布后&#xff0c;有网友联系我看看能不能做个后台管理界面&#xff0c;方便管理系统中所有的任务。由于时间和技术问题1.0版本的时候&#xff0c;新增了一个3分钟读取配置文件动态修改任务的功能&#xff0c;不过总体来说还是不直观&am…

Java对象的序列化与反序列化

转载自 Java对象的序列化与反序列化 序列化与反序列化 序列化 (Serialization)是将对象的状态信息转换为可以存储或传输的形式的过程。一般将一个对象存储至一个储存媒介&#xff0c;例如档案或是记亿体缓冲等。在网络传输过程中&#xff0c;可以是字节或是XML等格式。而字节的…

网站能拿到其他网站的cookie_网站能给公司带来哪些好处?

事实上&#xff0c;许多企业仍在努力建立一个网站&#xff0c;因为如果它建立起来&#xff0c;它需要一笔钱和其他费用。但此时客户业务不太好&#xff0c;企业客户需要考虑很多问题&#xff0c;但创建网站的企业已经尝到了甜头。其实有些朋友可能会有一些偏差。例如&#xff0…