unittest+selenium结合小技巧

 

   在使用unittest做单元测试时,我们可以跟selenium结合一块使用,这样的话有很多小技巧,本文就简单介绍一些他的写法。

 据说talk is cheap,所以 show my code(代码可以左右滑动,后文不再提示):

import unittestfrom selenium import webdriver#本代码以禅道为示例url = 'http://XX.XX.28.11/user-login-Lw==.html'
class ZentaoTestCase(unittest.TestCase):
  def setUp(self):    self.driver = webdriver.Chrome('/Users/zhang/downloads/chromedriver')    self.driver.get(url)     # 隐式等待,最长10秒,一次设置全局生效    self.driver.implicitly_wait(10)     #业务代码        self.driver.find_element_by_name('account').send_keys('admin')    self.driver.find_element_by_name('password').send_keys('131415qQ')    # 执行键盘操作    from selenium.webdriver.common.keys import Keys      self.driver.find_element_by_name('password').send_keys(Keys.ENTER)      def tearDown(self):    self.driver.quit()
  def testLogin(self):    #登陆的断言    assert 'admin'==self.driver.find_element_by_class_name('user-name').text    def testPageTitle1(self):    self.driver.find_element_by_link_text('测试').click()    self.driver.find_element_by_xpath("//*[@id='subNavbar']/ul/li/a").click()    #断言进入提bug页面,直接判断某个元素有没有即可。    assert self.driver.find_element_by_link_text('提Bug')
if __name__ == '__main__':    unittest.main(verbosity=2)    suite = unittest.TestSuite()    suite.addTest(ZentaoTestCase("testLogin"))    # 可以顺序添加多个case,这样就可以顺序执行单元测试了    suite.addTest(ZentaoTestCase("testPageTitle1"))    suite.addTest(ZentaoTestCase("testPageTitle2"))    runner = unittest.TextTestRunner()    runner.run(suite)

unittest3段论

import unittest
class TestZenTaoCase(unittest.TestCase):  def setUp(self):    pass  def tearDown(self):    pass  def testXXX(self):    #test code    pass

如上代码首先导入了单元测试模块,然后创建了一个测试类,并且继承了我们的unittest模块的TestCase类。这样的话,后面我们在类实例化时,就可以通过unittest的方式去实例化类,而不是再通过实例化自己测试类的方式去操作。

    然后就是unittest标准3段论,分别是启动前要执行的操作setUp函数,运行结束后操作tearDown函数,以及要执行的测试函数部分内容。

    其中setUp段函数内容,在所有的test函数每次运行前,都会运行,这样的话,方便我们在测试脚本运行前,先执行一些预加载操作。

    而同样的道理,tearDown函数,也会在所有的test函数每次结束运行后执行。

    最重要的代码部分是testXXX函数部分,这里是你最关键的测试代码,也就是要做断言的部分。尤其是需要注意的是:每个单元测试函数都是独立运行的,互相之间没有任何关联。  

selenium如何塞到unittest小小躯体里面

PART1:

 既然知道了unittest这3段论,那我们的脚本里面的内容塞进去的是啥呢。很显然是UI自动化脚本,也就是selenium的内容。

  def setUp(self):    self.driver = webdriver.Chrome('/Users/zhang/downloads/chromedriver')    self.driver.get(url)    # 隐式等待,最长10秒,一次设置全局生效    self.driver.implicitly_wait(10)     #业务代码    self.driver.find_element_by_name('account').send_keys('admin')    self.driver.find_element_by_name('password').send_keys('131415qQ')    # 执行键盘操作    from selenium.webdriver.common.keys import Keys      self.driver.find_element_by_name('password').send_keys(Keys.ENTER)

如上setUp函数代码部分,里面写的内容:实例化了谷歌浏览器,也就是我们的selenium的"司机"-driver。

然后访问了我们的url地址,然后设置了全局隐式等待时间为10秒,然后就是selenium的8种find_element定位元素大法了。

代码的最后导入了Keys模块,这个模块的作用是定义了键盘上的一些特殊操作,可以方便我们在使用selenium的时候,直接发送一些键盘操作给浏览器,让浏览器执行对应的操作,比如:这里的回车,或者CTRL键等键盘上的所有功能键。具体的有哪些键,感兴趣的可以直接去源码的selenium.webdriver.common.keys里面去看一下。

为啥写这些东西在setUp函数里面呢,因为我们要保证所有的testXXX函数都会用到,也就是每次启动的时候,都需要先执行对应的操作,也就是selenium在执行单元测试时,每次执行testXXX函数都会打开一个新的浏览器,并不会复用之前的浏览器。

因为每次都要访问url地址,并且登陆,以及selenium脚本步骤跟步骤之间的操作间隔默认情况下只有0.1秒的情况下,因为网络卡顿,页面元素没有加载完,而等不及后,就直接操作就失败。

PART2:

setUp函数部分完事了,再来看tearDown部分,这部分内容很简单

  def tearDown(self):    self.driver.quit()

只有一个浏览器退出操作,当然如果还有其他的扫尾操作,也可以加到这里。

PART3:

testXXX函数部分,也就是最关键的部分:

  def testLogin(self):    #登陆的断言    assert 'admin'==self.driver.find_element_by_class_name('user-name').text  

如上操作,其实只是做了一个断言,我们在使用selenium做UI自动化断言时,方式多种多样,可以断言浏览器的标题,也就是driver.title.我这里使用的是断言页面中其中一个元素的文本内容:admin.

其实assert 跟selenium或者unittest没有任何关系,在什么时候都可以用,而assert的写法,跟if语句写法一样,后面都是跟一个条件表达式,也就是可以判断True\False的语句。

上文还有第二个测试函数的断言是:

    assert self.driver.find_element_by_link_text('提Bug')

这句话乍看是有点问题的,其实这是很Pythonic的写法,也就是判断这个元素是否存在,如果存在的话,断言成功,否则失败。

unittest大结局

到了这里,基本上算是到尾声了,如下为结束部分代码:

if __name__ == '__main__':    unittest.main(verbosity=2)    suite = unittest.TestSuite()    suite.addTest(ZentaoTestCase("testLogin"))    # 可以顺序添加多个case,这样就可以顺序执行单元测试了    suite.addTest(ZentaoTestCase("testPageTitle1"))    suite.addTest(ZentaoTestCase("testPageTitle2"))    runner = unittest.TextTestRunner()    runner.run(suite)

上面的代码,算是unittest的写法结尾中的一种了,简单解释一下,第一句表面当在终端输出日志时,详细程度级别是2,第二句实例化了TestSuite类,然后第三句调用addTest顺序添加待执行的测试函数,当都添加完成后,再调用unittest的一种文本报告格式的Runner来执行,这样的话,报告打印的就是一个终端里面的文本内容,最后一句代码就是把前面添加的测试函数,依次执行。

当然了,unittest还支持html格式的报告,需要另外装包。也可以去通过查找指定包下面的所有py脚本(也就是模块),去挨个执行,而不仅仅是局限于当前单py脚本(也就是当前模块),也可以单独剔除掉一些,不准备执行的脚本。

unittest在实际工作中,还可以结合requests模块做接口自动化,而不仅仅只是一个单元测试脚本,所以大家可以多多尝试,发现他的一些更好用的技巧,提高自己的测试效率。

最后感谢每一个认真阅读我文章的人,看着粉丝一路的上涨和关注,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走


在此特意为大家准备了一份13G的超实用干货学习资源,涉及的内容非常全面,涵盖功能测试、Python编程语言,接口测试、UI自动化测试、性能测试......包括软件学习路线图,50多天的上课视频、16个突击实战项目,80余个软件测试用软件,37份测试文档,70个软件测试相关问题,40篇测试经验级文章,上千份测试真题分享,还有2022软件测试面试宝典,还有软件测试求职的各类精选简历,希望对大家有所帮助…..关注下方公众号免费获取~

相关推荐

2022年简历石沉大海,别投了,软件测试岗位饱和了....

各大互联网公司的接连裁员,政策限制的行业接连消失,让今年的求职雪上加霜,想躺平却没有资本,还有人说软件测试岗位饱和了,对此很多求职者深信不疑,因为投出去的简历回复的越来越少了。另一面企业招人真的变得容易了吗?有企业HR吐槽,简历确实比以前多了好几倍,其实是变相的增加了招聘难度,以前是从10份中找一个合适的,现在是从100份中找一个合适的,合适的依然那么少!...

1万+

APP测试要点汇总!一篇搞定!

软件客户端的应用形态主要为:web网站、PC客户端、APP、小程序。APP项目的测试点,跟web项目的测试点是存在差异性的。本篇文章将详细罗列APP测试要点,及web区别总结。

1168

【性能测试】一文3000字从0到1详解性能问题定位(建议收藏)

性能问题在软件开发中是一个常见的挑战。当用户遇到应用程序运行缓慢或卡顿的情况时,往往是由于性能问题造成。性能问题定位是解决这些问题的关键步骤之一,它能帮助我们找出造成应用程序性能差的根本原因。本文将从0到1详细且规范地介绍性能问题定位的过程。

1039

全链路压测:性能测试的流量录制和回放

一般在软件发布之前,都会经过单元测试, 接口测试, 集成测试, 性能测试等。但是这些测试往往都是基于自己定义的测试数据集合,很可能会有漏网之鱼,那么在软件上线之后,在线上流量冲击下,会出现各种之前测试中并没有发现的问题。这是因为线上的流量数据比测试的数据更加多样性,并且随着用户数量的增加,线上流量的也越来越大,更多的隐藏问题也会暴露,比如并发处理不当导致的Crash。那么我们有什么方法能够在上线之前完成这些测试呢?就是借助流量回放工具。GoReplay工具是go语言编写的一个http实时流量复制工具。

1256

接口自动化进阶 —— Pytest全局配置pytest.ini文件详解!

pytest.ini 是 Pytest 的全局配置文件,用于自定义测试运行的行为和规则。通过配置 pytest.ini,可以避免在命令行中重复输入参数,提升测试的效率和一致性。

1488

自动化测试面试必备:Top 10 技巧助你轻松过关!

自动化测试面试必备:Top 10 技巧助你轻松过关、自动化测试工程师在软件开发过程中扮演着至关重要的角色,而面试则是展示你技能和经验的重要环节。为了帮助你顺利通过自动化测试面试,我们整理了以下10个必备技巧,助你在面试中脱颖而出。

672

一文3000字从0到1带你接口测试基础知识【建议收藏】

接口测试是软件测试中的一个重要环节,它主要用于验证系统各个组件之间的相互通信是否正确,以及系统对外提供的接口是否符合预期的功能和性能要求。下面我将带你从零开始,详细介绍接口测试的基础知识。

1012

selenium教程 —— css定位!

​css定位说明、selenium中的css定位,实际是通过css选择器来定位到具体元素,css选择器来自于css语法、css定位优点、语法简洁、对比其他定位方式,定位效率更快、 对比其他定位方式,定位更稳定​

1298

接口自动化测试 —— 接口安全测试详解(建议收藏)

引言: 接口自动化测试是现代软件开发过程中不可或缺的一部分,而在测试中,接口安全测试更是至关重要的环节。本文将从0到1详细且规范的介绍接口安全测试的概念、方法和最佳实践,帮助读者全面了解如何进行接口安全测试并提供可信赖的接口服务。

725

高阶测试开发必备技能: k8s入门!

现在稍微有点规模公司都是基于docker容器化部署技巧,K8s现在主流,应用最广的容器集群管理技术。k8s全称kubernetes(首字母为 k、首字母与尾字母之间有 8 个字符、尾字母为 s,所以简称 k8s),基于Docker容器集群环境管理问题,是谷歌保密十几年的秘密武器----Borg系统的一个开源版本,于2014年9月发布第一个版本,2015年7月发布第一个正式版本。

647

渗透测试怎么做?看看大神一次完整的渗透测试实战!

渗透测试就是利用我们所掌握的渗透知识,对网站进行一步一步的渗透,发现其中存在的漏洞和隐藏的风险,然后撰写一篇测试报告,提供给我们的客户。客户根据我们撰写的测试报告,对网站进行漏洞修补,以防止黑客的入侵!

972

UI自动化测试太头疼?Playwright让你轻松搞定!

随着软件开发的日益复杂和用户期望的不断提高,UI(用户界面)自动化测试变得越来越重要。Playwright是一个开源的自动化测试工具,可以用于测试Web应用程序,支持多种浏览器,并提供强大的自动化测试功能。本文将介绍Playwright的基本概念,并通过实际示例演示如何执行UI自动化测试。

1229

接口自动化入门 —— JSON中的万能密码--JSONPath解析!

1. JSONPath 的核心概念、JSONPath 是一种查询语言,用于从 JSON 数据中提取特定的字段或值。它的表达式语法类似于 XPath,支持多种操作符和函数,能够快速定位和提取数据。‍

1318

接口自动化入门 —— Jmeter实现在接口工具中关联接口处理方案

1. JMeter 接口关联处理的核心概念、接口关联是指在多个接口请求之间共享数据,例如将一个接口的返回值作为另一个接口的输入参数。常见的场景包括:使用登录接口返回的 Token 作为后续接口的认证信息。将一个接口返回的 ID 作为另一个接口的请求参数。‍

1659

接口自动化入门 —— swagger/word/excelpdf等不同种类的接口文档理解!

在接口自动化测试中,接口文档是开发和测试人员理解接口功能、参数和交互方式的重要依据。常见的接口文档类型包括Swagger、Word、Excel和PDF。

1066

接口自动化入门 —— Http的请求头,请求体,响应码解析!

在接口自动化测试中,HTTP请求头、请求体和响应码是核心组成部分。理解它们的作用、格式和解析方法对于进行有效的接口测试至关重要。以下是详细解析:

1372

Requests库实战:手把手教你Python接口自动化!

在 Python 中进行网络请求是日常开发中的一个常见任务,而 requests 库是处理这类任务的一种强大工 具。requests 提供了简单而灵活的接口,使得发送 HTTP 请求和处理响应变得非常容易。在这篇文章中,我们将深入研究如何使用 requests 库执行各种网络请求,处理响应以及利用一些高级功能。

652

Python接口自动化之断言封装!

该框架支持两种断言方式,相等和包含。先看一下断言的yaml文件编写规范:

645

Selenium元素定位太难搞?这些坑我替你踩过了!

1.非select类下拉框、在非select类下拉框这里遇到了两种需求,一种是可输入字符,一种是不可输入字符、输入部分字符按照智能提示点选、这种下拉框允许输入字符,沟通后确定输入字符如出现多个选项则点选第一个

927

如何使用Selenium处理Cookie?

01、cookie介绍、HTTP协议是无状态的协议。一旦数据交换完毕,客户端与服务器端的连接就会关闭,再次交换数据需要建立新的连接,这就意味着服务器无法从连接上跟踪会话。也就是说即使第一次和服务器连接后并且登录成功后,第二次请求服务器依然不能知道当前请求是哪个用户。

1752

Web测试,小程序测试,app测试有哪些区别

Web测试、小程序测试和APP测试之间的还是存在显著的区别的,大概有以下几点:

961

2024性能测试入门基础知识【建议收藏】

性能测试是一种软件测试的类型,主要用于评估软件系统的性能和稳定性今天本文从4个方面来介绍性能测试入门基础知识

802

客户端SDK测试是什么?如何测?

客户端SDK是为第三方开发者提供的软件开发工具包,包括SDK接口、开发文档和Demo示例等。SDK和应用之间是什么关系呢?以云信即时消息服务为例,如下图所示,应用客户端通过调用云信SDK接口,进行消息等数据查询存储等操作,或通过协议与云信服务器间进行通信。

1163

【性能测试】一文3000字从0到1详解性能问题定位(建议收藏)

性能问题在软件开发中是一个常见的挑战。当用户遇到应用程序运行缓慢或卡顿的情况时,往往是由于性能问题造成。性能问题定位是解决这些问题的关键步骤之一,它能帮助我们找出造成应用程序性能差的根本原因。本文将从0到1详细且规范地介绍性能问题定位的过程。

396

高效执行自动化用例:分布式执行工具pytest-xdist实战!

在介绍pytest-xdist时,不讲任何原理,需要看原理的请移至官方:https://pypi.org/project/pytest-xdist/、当我们自动化测试用例非常多的时候, 一条条按顺序执行会非常慢,pytest-xdist的出现就是为了让自动化测试用例可以分布式执行,从而节省自动化测试时间,pytest-xdist是属于进程级别的并发。

852

UI自动化教程 —— 元素定位技巧:精确找到你需要的页面元素

在UI自动化测试中,准确地定位页面元素是至关重要的。无论是点击按钮、填写表单还是验证页面内容,都需要首先找到相应的页面元素。Playwright 提供了多种方法来实现这一点,包括使用CSS选择器和XPath进行元素定位,以及利用文本内容、属性值等高级策略。本文将详细介绍这些技术,并分享一些动态等待元素加载的最佳实践。

1408

【性能测试】一文3000字从0到1详解性能问题定位(建议收藏)

性能问题定位是解决软件性能问题的关键步骤之一。通过定位性能问题,我们可以找出造成性能问题的根本原因,并提出相应的解决方案。性能问题定位的过程需要收集足够的信息,分析性能问题的原因,进行性能测试,提出解决方案,并进行性能优化。同时,需要注意采用科学的方法、维护良好的报告和文档等。希望这篇文章可以帮助您更好地理解性能问题定位的过程,并提升软件开发的能力和水平。

1076

APP端网络测试与弱网模拟!

当前APP网络环境比较复杂,网络制式有2G、3G、4G网络,还有越来越多的公共Wi-Fi。不同的网络环境和网络制式的差异,都会对用户使用app造成一定影响。另外,当前app使用场景多变,如进地铁、上公交、进电梯等,使得弱网测试显得尤为重要。

968

从自动化到测开,测试人员逆袭之路从此起步!

在当今竞争激烈的软件测试行业中,近期的招聘市场确实面临一些挑战。大量的求职者争相涌入岗位,许多热衷于功能测试的人士甚至难以找到理想的工作机会。更不幸的是,连自动化测试和性能测试这些专业领域也受到了测试开发人员的竞争压力。然而,让我们抛开焦虑,聚焦于一个更广阔的发展方向——测试平台开发。

539

接口请求的六种常见方式详解(get、post、head等)

1、Get 向特定资源发出请求(请求指定页面信息,并返回实体主体)2、Post 向指定资源提交数据进行处理请求(提交表单、上传文件),又可能导致新的资源的建立或原有资源的修改3、Put 向指定资源位置上上传其最新内容(从客户端向服务器传送的数据取代指定文档的内容)4、Head 与服务器索与get请求一致的相应,响应体不会返回,获取包含在小消息头中的原信息(与get请求类似,返回的响应中没有具体内容,用于获取报头)

1346
上一篇: Python单元测试unittest实战
下一篇: 性能测试入门学习 ----- loadrunner常用函数大全及设置项
小码哥说测试
小码哥说测试 长沙凯标官方账号 长沙凯标官方账号
博客等级 码龄7年 1万+粉丝 2067原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值