unittest 的用法
一、discover方法
discover方法可以根据标准加载用例,并将结果返回给测试套件(suite),start_dir:待测试的目录,pattern:测试用例文件名的匹配规。
如:
start_dir = './test_case'suites = unittest.defaultTestLoader.discover(start_dir ,pattern='test.*py')
当执行多个目录的测试用例时,如何查找test_case下的其他目录吃里的测试用例文件呢?就是在test_case下每个目录里加__init__.py文件,这样会把这个目录当做标记成一个标准的Python模块。
二、测试用例的执行顺序是根据ASCLL码的顺序执行的。如:test_aaa.py优先于test_bbb.py。
三、装饰器 。这些装饰器不仅用在方法上,同样适用于类。四#跳过测试和预期失败
class MyTest(unittest.TestCase):
@unittest.skip('直接跳过测试')
def test_skip(self):
print('test aaa') @unittest.skipIf(3>2,'条件为真时跳过装饰的测试')
def test_skip_if(self):
print('test bbb') @unittest.skipUnless(3>2,'条件为真时执行装饰的测试')
def test_skip_unless(self):
print('test ccc') @unittest.expectedFailure
def test_expected_failure(self):
self.assertEqual(3,3) if __name__ == '__main__':
unittest.main() 四、Fixture 执行一个或者多个测试所需要的环境。如创建临时或者代理 数据库、目录、或者启动服务器进程。
import unittest def setUpModule():
print('test module start >>>>>>>>>>>>>>>>')
def tearDownModule():
print('test module end >>>>>>>>>>>>>>>>>>') class MyTest2(unittest.TestCase):
@classmethod
def setUpClass(cls):
print('test class start >>>>>>>>>>>>>>') @classmethod
def tearDownClass(cls):
print('test class end >>>>>>>>>>>>>>>>') def setUp(self):
print('test case start>>>>>>>>>>>>>>') def tearDown(self):
print('test case end>>>>>>>>>>>>>>>') def test_case1(self):
print('test case1') def test_case2(self):
print("test case2") if __name__ == '__main__':
unittest.main()
五、断言方法。
class TestAssert(unittest.TestCase):
def test_equal(self):
self.assertEqual(2+2,4)
self.assertEqual('python','python')
self.assertNotEqual('python','pythno')
def test_in(self):
self.assertIn('hello','hello world')
self.assertNotIn('hi','hello')
def test_true(self):
self.assertTrue(1) # or Ture
self.assertFalse(0) # or False
六、数据驱动应用。
常用的csv读取数据执行用例,会导致所有数据被当做一条用例来执行,只要有一条用例失败,那么整个用例就执行失败了。一种解决方法是将数据读取到列表中,在用例中按照下标来调用。
但是这样有两个问题,一是每次都要读取文件,耗费空间,二是数据在列表中,如果插入一条数据,或者删除一条数据,那么用例在调用数据时就会非常容易出错,不利于维护。
下面介绍2个模块来解决数据驱动问题。
Parameterized是Python的一个库。支持unittest、pytest、Nose框架。
import unittest
from time import sleep
from selenium import webdriver
from parameterized import parameterized class TestBaidu(unittest.TestCase):
'''百度搜索测试'''
@classmethod
def setUpClass(cls):
cls.driver = webdriver.Chrome()
cls.base_url = 'https://www.baidu.com' def baidu_search(self,search_key):
self.driver.get(self.base_url)
self.driver.find_element_by_id('kw').send_keys(search_key)
self.driver.find_element_by_id('su').click()
sleep(2) @parameterized.expand([
('case1','selenium'),
('case2', 'unittest'),
('case3', 'parameterized'),
])
def test_search(self,name,search_key):
''''''
self.baidu_search(search_key)
self.assertEqual(self.driver.title,search_key + '_百度搜索') @classmethod
def tearDownClass(cls):
cls.driver.quit() if __name__ == '__main__':
unittest.main() 在@parameterized.expand()中每个元组都是一条测试用例。name对应的是元组中第一列数据,search_key对应的是第二列数据。参数化会自动加上0,1,2来区分每条用例。元组中的数据作为用例名的后缀出现在测试报告中。
DDT是uittest的一个扩展库。
测试类需要通过@ddt装饰器进行装饰。DDT提供不同形式的参数化,比如列表,元组,字典等。需要注意字典的KEY与测试方法的参数要保持一致。
DDT也支持数据文件(json)的参数化。
import unittest
from time import sleep
from selenium import webdriver
from ddt import ddt,data,file_data,unpack @ddt
class TestBaidu(unittest.TestCase):
'''百度搜索测试'''
@classmethod
def setUpClass(cls):
cls.driver = webdriver.Chrome()
cls.base_url = 'https://www.baidu.com' def baidu_search(self,search_key):
self.driver.get(self.base_url)
self.driver.find_element_by_id('kw').send_keys(search_key)
self.driver.find_element_by_id('su').click()
sleep(2) @data(['case1','selenium'],['case2','unittest'],['case3', 'parameterized'])
@unpack
def test_search1(self,name,search_key):
print('第一组测试用例:', name)
self.baidu_search(search_key)
self.assertEqual(self.driver.title,search_key + '_百度搜索') @data(('case1','selenium'),
('case2', 'unittest'),
('case3', 'parameterized'),)
@unpack
def test_search2(self, name, search_key):
print('第二组测试用例:',name)
self.baidu_search(search_key)
self.assertEqual(self.driver.title, search_key + '_百度搜索') @data({"search_key":"python"},{"search_key":"ddt"},{"search_key":"Selenium"})
@unpack
def test_search2(self, search_key):
print('第三组测试用例:',search_key)
self.baidu_search(search_key)
self.assertEqual(self.driver.title, search_key + '_百度搜索') # @file_data('ddt_data_file.json')
# def test_search4(self, search_key):
# print('第四组测试用例:',search_key)
# self.baidu_search(search_key)
# self.assertEqual(self.driver.title, search_key + '_百度搜索') @classmethod
def tearDownClass(cls):
cls.driver.quit() if __name__ == '__main__':
unittest.main()
ddt_data_file.json
{
"case1":{"search_key":"python"},
"case2":{"search_key":"ddt"},
"case3":{"search_key":"Selenium"}
}
七、HTML测试报告。HTMLTestRunner支持Python3的下载地址:https://github.com/defnngj/HTMLTestRunner
#获取当前的时间
now_time = time.strftime('%Y-%m-%d %H_%M_%S')
HTML_report = './test_report/'+now_time+'result.html'
fp = open(HTML_report,'wb')
runner = HTMLTestRunner(stream=fp,title='Fixture', description='运行环境:Windows 10,Chrome浏览器')
runner.run(suites)
#关闭
fp.close()
unittest 的用法的更多相关文章
- PyUnit (unittest) 的用法
PyUnit(unittest) 是 Python 自带的单元测试框架,用于编写和运行可重复的测试.PyUnit 是 xUnit 体系的一个成员,xUnit 是众多测试框架的总称,PyUnit 主要用 ...
- 记录python接口自动化测试--unittest框架基本应用(第二目)
在第一目里写了几个简单demo,并把调用get和post请求的方法封装到了一个类里,这次结合python自带的unittest框架,用之前封装的方法来写一个接口测试demo 1.unittest简单用 ...
- python unittest框架装饰器
要说单元测试和UI自动化之间的是什么样的一个关系,说说我个人的一些心得体会吧,我并没有太多的这方面经验,由于工作本身就用的少,还有就是功能测试点点对于我这种比较懒惰的人来说,比单元测试复杂...思考单 ...
- unittest单元测试,基于java的junit测试框架
import unittestclass study(unittest.TestCase): def testXia(self): self.assertEqual((3*4),20) def tes ...
- Python unittest(PyUnit)单元测试框架
PyUnit(unittest) 是 Python 自带的单元测试框架,用于编写和运行可重复的测试.PyUnit 是 xUnit 体系的一个成员,xUnit 是众多测试框架的总称,PyUnit 主要用 ...
- <自动化测试>之<unittest框架使用1>
要说单元测试和UI自动化之间的是什么样的一个关系,说说我个人的一些心得体会吧,我并没有太多的这方面经验,由于工作本身就用的少,还有就是功能测试点点对于我这种比较懒惰的人来说,比单元测试复杂...思考单 ...
- unittest学习
unittest的四大特点 TestCase:测试用例.所有的用例都是直接继承与UnitTest.TestCase类. TestFixture:测试固件.setUp和tearDown分别作为前置条件和 ...
- selenium+python笔记3
#!/usr/bin/env python # -*- coding: utf-8 -*- """ @desc:学习unittest的用法 注意setUp/setUpCl ...
- 自研测试框架ktest介绍(适用于UI和API)
iTesting,爱测试,爱分享 在自动化测试的过程中,测试框架是我们绕不过去的一个工具,无论你是不需要写代码直接改动数据生成脚本,还是你需要检查测试结果甚至持续集成,测试框架都在发挥它的作用. 不同 ...
随机推荐
- MVC-Session
1.什么是Session? Session即会话,是指一个用户在一段时间内对某一个站点的一次访问. Session对象在.NET中对应HttpSessionState类,表示"会话状态& ...
- 理解ld-linux.so.2
翻译自:Understanding ld-linux.so.2 前言 ld-linux.so.2是linux的动态加载器(dynamic loader).本文试图就ld-linux.so.2如何与Li ...
- DNS服务——域名解析转发 和 条件转发
前言 有一台Linux机器作为DNS服务器,查看这台机器上的DNS文件,发现指向互联网上的DNS服务器. [root@ziqiang named]# cat /etc/resolv.conf # Ge ...
- charles 手机抓包设置
本文参考:charles 抓包手机 charles经常会进行手机上的网页抓包,比如去copy别人网站图片或脚本的时候o(∩_∩)o : 手机抓包的原理,和PC类似,手机依靠charles与服务端进行对 ...
- Socket实现client和server端通信(Java)(转)
转自: https://blog.csdn.net/yayun0516/article/details/50819147 https://www.jianshu.com/p/2d4f223f1462 ...
- 设置input 中placeholder的样式
::-webkit-input-placeholder { /* Chrome/Opera/Safari */ position: relative; top: 4px; } ::-moz-place ...
- Apache查看连接数和限制当前的连接数
在wamp环境下查看apche连接数和限制当前的连接数 httpd_mpm.conf文件在你apache安装上当的\\conf\\extra中,还在就是在要apache httpd.conf中把#In ...
- Prometheus+Grafana监控
什么是Prometheus? Prometheus是由SoundCloud开发的开源监控报警系统和时序列数据库(TSDB).Prometheus使用Go语言开发,是Google BorgMon监控系统 ...
- Codeforces Round #413 (Div1 + Div. 2) C. Fountains(树状数组维护最大值)
题目链接:https://codeforces.com/problemset/problem/799/C 题意:有 c 块硬币和 d 块钻石,每种喷泉消耗硬币或钻石中的一种,每个喷泉有一个美丽值,问建 ...
- HDU 6162 - Ch’s gift | 2017 ZJUT Multi-University Training 9
/* HDU 6162 - Ch’s gift [ LCA,线段树 ] | 2017 ZJUT Multi-University Training 9 题意: N节点的树,Q组询问 每次询问s,t两节 ...
