unittest详解(三) 测试套件(TestSuite)
在前面一章中示例了如何编写一个简单的测试,但有两个问题:
- 我们知道测试用例的执行顺序是根据测试用例名称顺序执行的,在不改变用例名称的情况下,我们怎么来控制用例执行的顺序呢?
- 一个测试文件,我们直接执行该文件即可,但如果有多个测试文件,怎么进行组织,总不能一个个文件执行吧?
要解决上面两个问题,我们就要用到测试套件(TestSuite)了
代码:
- # coding = utf-8
- import unittest
- import warnings
- from selenium import webdriver
- from time import sleep
- # 驱动文件路径
- driverfile_path = r'D:\coship\Test_Framework\drivers\IEDriverServer.exe'
- class CmsLoginTest(unittest.TestCase):
- def setUp(self):
- # 这行代码的作用是忽略一些告警打印
- warnings.simplefilter("ignore", ResourceWarning)
- self.driver = webdriver.Ie(executable_path=driverfile_path)
- self.driver.get("http://172.21.13.83:28080/")
- def tearDown(self):
- self.driver.quit()
- def test_login1(self):
- '''用户名、密码为空'''
- self.driver.find_element_by_css_selector("#imageField").click()
- error_message1 = self.driver.find_element_by_css_selector("[for='loginName']").text
- error_message2 = self.driver.find_element_by_css_selector("[for='textfield']").text
- self.assertEqual(error_message1, '用户名不能为空')
- self.assertEqual(error_message2, '密码不能为空')
- def test_login3(self):
- '''用户名、密码正确'''
- self.driver.find_element_by_css_selector("[name='admin.loginName']").send_keys("autotest")
- self.driver.find_element_by_css_selector("[name='admin.password']").send_keys("")
- self.driver.find_element_by_css_selector("#imageField").click()
- sleep(1)
- self.driver.switch_to.frame("topFrame")
- username = self.driver.find_element_by_css_selector("#nav_top>ul>li>a").text
- self.assertEqual(username,"autotest")
- def test_login2(self):
- '''用户名正确,密码错误'''
- self.driver.find_element_by_css_selector("[name='admin.loginName']").send_keys("autotest")
- self.driver.find_element_by_css_selector("[name='admin.password']").send_keys("")
- self.driver.find_element_by_css_selector("#imageField").click()
- error_message = self.driver.find_element_by_css_selector(".errorMessage").text
- self.assertEqual(error_message, '密码错误,请重新输入!')
- def test_login4(self):
- '''用户名不存在'''
- self.driver.find_element_by_css_selector("[name='admin.loginName']").send_keys("test007")
- self.driver.find_element_by_css_selector("[name='admin.password']").send_keys("")
- self.driver.find_element_by_css_selector("#imageField").click()
- error_message = self.driver.find_element_by_css_selector(".errorMessage").text
- self.assertEqual(error_message, '用户不存在!')
- if __name__ == "__main__":
- # 构造测试套件
- suite = unittest.TestSuite()
- suite.addTest(CmsLoginTest("test_login1"))
- suite.addTest(CmsLoginTest("test_login2"))
- suite.addTest(CmsLoginTest("test_login4"))
- suite.addTest(CmsLoginTest("test_login3"))
- # 执行测试
- runner = unittest.TextTestRunner(verbosity=2)
- runner.run(suite)
注:verbosity
参数可以控制输出的错误报告的详细程度,默认是 1;
如果设为 0
,则不输出每一用例的执行结果;如果设为 2
,则输出详细的执行结果
执行结果:
- "C:\Program Files\Python36\python.exe" D:/Git/Test_Framework/utils/1.py
- test_login1 (__main__.CmsLoginTest)
- 用户名、密码为空 ... ok
- test_login2 (__main__.CmsLoginTest)
- 用户名正确,密码错误 ... ok
- test_login4 (__main__.CmsLoginTest)
- 用户名不存在 ... ok
- test_login3 (__main__.CmsLoginTest)
- 用户名、密码正确 ... ok
- ----------------------------------------------------------------------
- Ran 4 tests in 44.818s
- OK
- Process finished with exit code 0
从用例的执行结果中我们可以看到,用例的执行顺序是按照添加用例时的顺序来执行的
一个一个地添加测试用例到测试套件中,有点麻烦,其实我们可以把要执行的测试用例用个列表来管理,然后再把这个列表添加到测试套件中,如下代码:
- if __name__ == "__main__":
- # 构造测试套件
- suite = unittest.TestSuite()
- test_cases = [CmsLoginTest("test_login1"),CmsLoginTest("test_login2"),CmsLoginTest("test_login4"),
- CmsLoginTest("test_login3")]
- suite.addTests(test_cases)
- # 执行测试
- runner = unittest.TextTestRunner(verbosity=2)
- runner.run(suite)
下面我们就来讲讲多个文件的测试用例组织。
假如我有两个系统的登录需要测试,测试用例分别放在两个文件中(cmslogin.py,smelogin.py),现在我需要把这两个文件中的用例添加到一个测试套件中来执行,为此我们要重新建立一个叫run_all.py的文件
- import unittest
- from cmslogin import CmsLoginTest
- from smelogin import SmeLoginTest
- if __name__ == "__main__":
- # 构造测试套件
- suite = unittest.TestSuite()
- test_cases = [CmsLoginTest("test_login1"),CmsLoginTest("test_login2"),CmsLoginTest("test_login4"),
- CmsLoginTest("test_login3"),SmeLoginTest("test_login1"),SmeLoginTest("test_login2")]
- suite.addTests(test_cases)
- # 执行测试
- runner = unittest.TextTestRunner(verbosity=2)
- runner.run(suite)
还可以用addTests + TestLoader方法来添加用例,但是这种方法是无法对case进行排序的
- import unittest
- from cmslogin import CmsLoginTest
- from smelogin import SmeLoginTest
- if __name__ == "__main__":
- # 构造测试套件
- suite = unittest.TestSuite()
- # 第一种方法:传入'模块名.TestCase名'
- suite.addTests(unittest.TestLoader().loadTestsFromName('cmslogin.CmsLoginTest'))
- suite.addTests(unittest.TestLoader().loadTestsFromName('smelogin.SmeLoginTest'))
- # 这里还可以把'模块名.TestCase名'放到一个列表中
- suite.addTests(unittest.TestLoader().loadTestsFromNames(['cmslogin.CmsLoginTest','smelogin.SmeLoginTest']))
- # 第二种方法:传入TestCase
- suite.addTests(unittest.TestLoader().loadTestsFromTestCase(CmsLoginTest))
- # 执行测试
- runner = unittest.TextTestRunner(verbosity=2)
- runner.run(suite)
unittest详解(三) 测试套件(TestSuite)的更多相关文章
- .NET DLL 保护措施详解(三)最终效果
针对.NET DLL 保护措施详解所述思路完成最终的实现,以下为程序包下载地址 下载 注意: 运行环境为.net4.0,需要安装VS2015 C++可发行组件包vc_redist.x86.exe.然后 ...
- Android 之窗口小部件详解(三) 部分转载
原文地址:http://blog.csdn.net/iefreer/article/details/4626274. (一) 应用程序窗口小部件App Widgets 应用程序窗口小部件(Widget ...
- linux下getsockopt和setsockopt详解及测试
linux下getsockopt和setsockopt详解及测试 NAME 名字 getsockopt, setsockopt - get and set options on sockets 获取或 ...
- unittest详解(四) 批量执行用例(discover)
前面我们说了,对于不同文件用例,我们可以通过addTest()把用例加载到一个测试套件(TestSuite)来统一执行,对于少量的文件这样做没问题,但是如果有几十上百个用例文件,这样做就太浪费时间了. ...
- WebSocket安卓客户端实现详解(三)–服务端主动通知
WebSocket安卓客户端实现详解(三)–服务端主动通知 本篇依旧是接着上一篇继续扩展,还没看过之前博客的小伙伴,这里附上前几篇地址 WebSocket安卓客户端实现详解(一)–连接建立与重连 We ...
- logback -- 配置详解 -- 三 -- <encoder>
附: logback.xml实例 logback -- 配置详解 -- 一 -- <configuration>及子节点 logback -- 配置详解 -- 二 -- <appen ...
- python设计模式之装饰器详解(三)
python的装饰器使用是python语言一个非常重要的部分,装饰器是程序设计模式中装饰模式的具体化,python提供了特殊的语法糖可以非常方便的实现装饰模式. 系列文章 python设计模式之单例模 ...
- Python操作redis字符串(String)详解 (三)
# -*- coding: utf-8 -*- import redis #这个redis不能用,请根据自己的需要修改 r =redis.Redis(host=") 1.SET 命令用于设置 ...
- pika详解(三)SelectConnection及其他Connection
pika详解(三)SelectConnection及其他Connection 本文链接:https://blog.csdn.net/comprel/article/details/94661147 ...
随机推荐
- oracle 插入数据之坑--------oracle字符类型varchar2一个中文占多少字节
如果你误认为是两个字节,那就大错特错了 Oracle 一个中文汉字 占用几个字节,要根据Oracle中字符集编码决定 查看oracle server端字符集 select userenv('langu ...
- 【模板】SPFA(不完全详解)
一种最短路求法(个人觉得比DIJKSTRA好用) 用于有向图. 大概思路:从根节点开始,枚举每一个点,同时更新他们所联通的点的最短路径,如果路径被更新,则把这个点入队,一直重复这个操作直到队伍为空为止 ...
- python_0基础开始_day11
第十一节 一,函数名的第一类对象 函数名当作值,赋值给变量 print(函数名) 查看看书的内存地址 函数名可以当作容器中的元素 lis = []dic = {}def func(): prin ...
- 使用Keras基于AdvancedEAST的场景图像文本检测
Blog:https://blog.csdn.net/linchuhai/article/details/84677249 GitHub:https://github.com/huoyijie/Adv ...
- JSP和JSTL视图解析器
使用JSTL users.jsp <%@ page language="java" contentType="text/html; charset=UTF-8&qu ...
- [转载]C++二维动态数组memset()函数初始化
来源:https://blog.csdn.net/longhopefor/article/details/20994919 先说说memset函数: void *memset(void *s,int ...
- PHP 网站大数据大流量与高并发 笔记
前端: 1.域名开启cdn 2.大文件使用oss php: 1.模板编译缓存 服务器: 1.负载均衡 数据库: 1.读写分离 待完善
- Spring整合Hessian访问远程服务
声明:该文章转载自Spring整合Hessian访问远程服务,本人搬过来只是为了记录下学习Hessian的过程,忘此博主理解,在此感谢,等本人有能力了再学一些原创的东东,本人实践了下,hessianS ...
- 【Groovy】 Groovy笔记
一.简单了解Groovy Groovy简介: Groovy是基于JVM的敏捷开发语言,语法与Java类似,但更加简洁,容错性也比Java强,同时Java能非常好的契合(例如Groovy能够使用Java ...
- Mac破解软件 “XXX”意外退出 奔溃解决方法
最近很多破解软件提示“XXX”意外退出.这是因为苹果在7月12日删除了TNT的证书,所以大部分TNT破解的Mac软件会出现无法打开,提示意外退出. 目前的解决办法是在终端执行命令: 1.首先安装“A ...