Python+Selenium笔记(四):unittest的Test Suite(测试套件)
(一) Test Suite测试套件
一个测试套件是多个测试或测试用例的集合,是针对被测程序的对应的功能和模块创建的一组测试,一个测试套件内的测试用例将一起执行。
应用unittest的TestSuites特性,可以将不同的测试组成一个逻辑组,然后设置统一的测试套件,并通过一个命令来执行测试。这都是通过TestSuites、TestLoader和TestRunn类来实现的。
(二) 类级别的setUp()方法和tearDown()方法
使用setUpClass()方法和tearDownClass()方法及@classmethod标识来实现各个测试方法共享初始化数据。具体看下面的代码。
(三) searchtest.py
import unittest
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChainsimport time
class SearchTest(unittest.TestCase):
'''通过setUpClass()和@classmethod标识,实现
在类级别初始化数据,所有测试方法共享这些初始化数据.
不使用这个的话,每个测试方法都会单独创建一个实例'''
@classmethod
def setUpClass(cls):
cls.driver = webdriver.Firefox()
cls.driver.implicitly_wait(10)
cls.driver.maximize_window()
cls.driver.get("https://www.cnblogs.com/")
def test_search_by_category(self):
#读取category.txt文件,返回一个字典
with open('data/category.txt', encoding='UTF-8') as category_file:
category_dict = dict()
category_data = category_file.readline().strip().split(',')
the_class = category_data.pop(0)
category_dict[the_class] = category_data
#定位首页网站分类中的编程语言
self.search_class = self.driver.find_element_by_xpath('//li/a[@href="/cate/2/"]')
#光标悬停在“编程语言”上
ActionChains(self.driver).move_to_element(self.search_class).perform()
# 以列表形式返回编程语言下的所有小类
self.search_small = self.driver.find_elements_by_xpath(
'//div[@id="cate_content_block_2"]/div[@class="cate_content_block"]/ul/li')
#休眠3秒
time.sleep(3)
small_cate = []
for s in self.search_small:
#去掉小类最后面的(0),并添加到列表small_cate中
small = str(s.text).split('(')
small_cate.append(small[0])
#检查表达式是否为true(此处检查编程语言下的小类是否与预期结果一致)
self.assertTrue(small_cate == category_dict["编程语言"])
# self.assertEqual(small_cate,category_dict["编程语言"])
def test_search_by_look(self):
self.seach_class = self.driver.find_element_by_xpath('//li/a[@href="/cate/2/"]')
#定位编程语言下的小类Python
self.seach_small =self.driver.find_element_by_xpath('//li/a[@href="/cate/python/"]')
ActionChains(self.driver).move_to_element(self.seach_class).perform()
self.seach_small.click()
#检查打开的网页标题是不是 Python - 网站分类 - 博客园
# assert "Python - 网站分类 - 博客园" in self.driver.title
self.assertEqual(self.driver.title,"Python - 网站分类 - 博客园" )
'''通过tearDownClass()和@classmethod标识,实现
在类级别初始化数据,所有测试方法共享这些初始化数据'''
@classmethod
def tearDownClass(cls):
cls.driver.quit()
#加上下面2句,可以通过命令行运行测试,不加的话不影响通过IDE运行测试
if __name__ == '__main__':
#加verbosity=2参数,在命令行中显示具体的测试方法
unittest.main(verbosity=2)
(四) homepagetest.py
import unittest
from selenium import webdriver
from selenium.common.exceptions import NoSuchElementException
from selenium.webdriver.common.by import By
class HomePageTest(unittest.TestCase):
'''通过setUpClass()和@classmethod标识,实现
在类级别初始化数据,所有测试方法共享这些初始化数据.
不使用这个的话,每个测试方法都会单独创建一个实例'''
@classmethod
def setUpClass(cls):
cls.driver = webdriver.Firefox()
cls.driver.implicitly_wait(10)
cls.driver.maximize_window()
cls.driver.get("https://www.cnblogs.com/")
def test_search_field(self):
#通过by,检查博客园首页有没有搜索框,is_element_present()是自定义的方法
self.assertTrue(self.is_element_present(By.ID,"zzk_q"))
def test_search_btn(self):
# 通过by,检查博客园首页有没有找找看按钮
self.assertTrue(self.is_element_present(By.CLASS_NAME,"search_btn"))
def test_menu(self):
#该方法检查博客园首页菜单栏信息是否与预期一致
#读取menu.txt文件数据
with open('data/menu.txt',encoding='UTF-8') as menu_file:
menu_data = menu_file.readline().strip().split(',')
#以列表形式返回博客园首页菜单栏信息
self.check_menu = self.driver.find_elements_by_xpath('//div[@id="nav_menu"]/a')
the_menu = []
for c in self.check_menu:
#将博客园首页的菜单名称和URL添加到列表the_menu
the_menu.append(c.text + c.get_attribute('href'))
#检查2个列表是否一致(检查博客园首页的菜单名称及URL是否和预期一致)
self.assertListEqual(the_menu,menu_data)
def is_element_present(self,how,what):
#找到元素,返回True,否则返回False
try:
self.driver.find_element(by=how,value = what)
except NoSuchElementException as e:
return False
return True
@classmethod
def tearDownClass(cls):
cls.driver.quit()
# 加上下面2句,可以通过命令行运行测试,不加的话不影响通过IDE运行测试
if __name__ == '__main__':
# 加verbosity=2参数,在命令行中显示具体的测试方法
unittest.main(verbosity=2)
(五) smoketests.py (测试套件)
import unittest
from searchtest import SearchTest
from homepagetest import HomePageTest
#获取SearchTest类 和 HomePageTest类中的所有测试方法
search_test = unittest.TestLoader().loadTestsFromTestCase(SearchTest)
home_page_test = unittest.TestLoader().loadTestsFromTestCase(HomePageTest)
#创建一个包括SearchTest和HomePageTest的测试套件
smoke_tests = unittest.TestSuite([home_page_test,search_test])
#运行测试套件
unittest.TextTestRunner(verbosity=2).run(smoke_tests)
(六) 其他说明
#另外一个文件在上一篇中已经说明
要完全使用上面的代码,需要创建一个文件menu.txt,输入以下数据:
园子https://home.cnblogs.com/,新闻https://news.cnblogs.com/,博问https://q.cnblogs.com/,闪存https://ing.cnblogs.com/,小组https://group.cnblogs.com/,收藏https://wz.cnblogs.com/,招聘https://job.cnblogs.com/,班级https://edu.cnblogs.com/,找找看http://zzk.cnblogs.com/

(七) 运行smoketests.py

Python+Selenium笔记(四):unittest的Test Suite(测试套件)的更多相关文章
- Python+Selenium笔记(三):使用unittest
#网络很慢可能会运行报错 (一) 前言 Selenium WebDriver是一个浏览器自动化测试的API集合.它提供了很多与浏览器自动化交互的特性,并且这些API主要是用于测试Web程序.如果仅 ...
- Python+Selenium笔记(十四)鼠标与键盘事件
(一) 前言 Webdriver高级应用的API,允许我们模拟简单到复杂的键盘和鼠标事件,如拖拽操作.快捷键组合.长按以及鼠标右键操作,都是通过使用webdriver的Python API 中的Ac ...
- Python+Selenium笔记(九):操作警告和弹出框
#之前发的 driver.switch_to_alert() 这句虽然可以运行通过,但是会弹出警告信息(这种写法3.x不建议使用) 改成 driver.switch_to.alert就不会了. (一 ...
- Python+Selenium笔记(十八):持续集成jenkins
(一)安装xmlrunner 使用Jenkins执行测试时,测试代码中会用到这个模块. pip install xmlrunner (二)安装jenkins (1) 下载jekins https: ...
- Python+Selenium笔记(五):生成测试报告
#HTMLTestRunner代码修改参考 微微微笑 的说明,下面是链接,这个已经说的很详细了 https://www.cnblogs.com/miniren/p/5301081.html (一) 前 ...
- python学习笔记:unittest单元测试
单元测试:开发自测时写的代码 unittest基本原理: ♦整个平台的搭建使用的是python的unittest测试框架,这里简单介绍下unittest模块的简单应用. ♦unittest是pytho ...
- python学习笔记之——unittest框架
unittest是python自带的单元测试框架,尽管其主要是为单元测试服务的,但我们也可以用它来做UI自动化测试和接口的自动化测试. unittest框架为我们编写用例提供了如下的能力 定义用例的能 ...
- Python + selenium之组织unittest单元测试用例
当增加被测功能和相应的测试用例之后unittest单元测试框架如何扩展和组织新增的测试用例的. # coding =utf-8 # calculator class Count (): def __i ...
- Python学习笔记:Unittest框架了解
Unittest单元测试框架不仅可以适用于单元测试,还可以适用于自动化测试用来的开发与执行,该测试框架可执行测试用例,并提供丰富的断言方法,最终生成测试报告. 一.Unittest常用方法 1.Tes ...
随机推荐
- charles撰写工具/compose和Compose New
撰写工具/compose和Compose New compose 是在原有的请求基础上,修改: compose New 是新出一个弹窗,自己手动一个个的去写: 可以写各种状态:– URL:– Meth ...
- Java语法糖之内部类
例1: class Outer { public void md1(final int a) { final int b = 1; class LocalA { int c = a; } class ...
- 26、redis中默认有多少个哈希槽?
Redis 集群中内置了 16384 个哈希槽,当需要在 Redis 集群中放置一个 key-value时,redis 先对 key 使用 crc16 算法算出一个结果,然后把结果对 16384 求余 ...
- Spring Boot使用JWT实现系统登录验证
简介 什么是JWT(Json Web Token) jwt是为了在网络应用环境间传递声明而执行的一种基于json的开放标准.该token被设计紧凑且安全的,特别适用于SSO场景.jwt的声明一般被用来 ...
- sshd服务防止暴力破解
sshd防止暴力破解几种方式: 1.密码足够复杂 2.修改默认端口号 3.不适用root用户名登录. #是否可以禁止root身份登录?不行,因为有些程序需要使用root什么登录,另外判断一个用户是不是 ...
- Tomcat学习总结(10)——Tomcat多实例冗余部署
昨天在跟群友做技术交流的时候,了解到,有很多大公司都是采用了高可用的,分布式的,实例沉余1+台.但是在小公司的同学也很多,他们反映并不是所有公司都有那样的资源来供你调度.往往公司只会给你一台机器,因为 ...
- QT 手式编译步骤
1: qmake -project 2: qmake 3: make 4: ./执行
- 使用area标签模仿a标签
众所周知,map标签可以给img图像标记热点区域,而area标签就是跟map标签一起使用的. 但area标签的作用可不止用来标记热点,因为它也有href属性,因此某些场景可以代替a标签进行页面跳转. ...
- Http请求处理流程
本文结构: 一.HTTP请求处理流程的基础 1.网络分层 因特网TCP/IP分层模型共有五层:应用层.传输层.网络层.网络接口层和物理层.这种分层模型不同于OSI七层参考模型,但是,是实际使用中采用的 ...
- HDU4283(KB22-G)
You Are the One Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)T ...