标签(空格分隔): unittest


unittest介绍:

python里面也有单元测试框架-unittest,相当于是一个python版的junit。

一、unittest简介

1.先导入unittest,用help函数查看源码解析

python的单元测试框架,是像java的junit框架:

  1. #!/usr/bin/env python
  2. # coding=utf-8
  3. import unittest
  4. class InTestCase(unittest.TestCase):
  5. def testAdd(self):
  6. self.assertEqual((1+2),3)
  7. self.assertEqual(0+1,1)
  8. def testM(self):
  9. self.assertEqual((0*10),0)
  10. self.assertEqual((5*8),40)
  11. if __name__ == '__main__':
  12. unittest.main()

2.第一行是导入unittest这个模块

3.class这一行是定义一个测试的类,并继承unittest.TestCase这个类

4.接下来是定义了两个测试case名称:testAdd和testM

  • 测试用例的名称要以test开头;

5.然后是断言assert,这里的断言方法是assertEqual-判断两个是否相等,这个断言可以是一个也可以是多个

最后的结果是:

  1. ..
  2. ----------------------------------------------------------------------
  3. Ran 2 tests in 0.000s
  4. OK

案例:

  1. #!/usr/bin/env python
  2. # coding=utf-8
  3. import unittest
  4. class InTestCase(unittest.TestCase):
  5. def testMinus(self):
  6. u'''这是测试减法'''
  7. result = 6-5
  8. hope=1
  9. self.assertEqual(result,hope)
  10. def testDivide(self):
  11. u'''这里测试除法'''
  12. result= 7/2
  13. hope=3.5
  14. self.assertEqual(result,hope)
  15. if __name__ == '__main__':
  16. unittest.main()

执行结果:

AssertionError: 3 != 3.5

前置和后置

1.setUp:在写测试用例的时候,每次操作其实都是基于打开浏览器输入对应网址这些操作,这个就是执行用例的前置条件。

2.tearDown:执行完用例后,为了不影响下一次用例的执行,一般有个数据还原的过程,这就是执行用例的后置条件。

3.前置和后置都是非必要的条件,如果没有也可以写pass

unittest的执行顺序:

例如:

  1. #!/usr/bin/env python
  2. # coding=utf-8
  3. import unittest
  4. import time
  5. class Test(unittest.TestCase):
  6. def setUp(self):
  7. print("start!")
  8. def tearDown(self):
  9. time.sleep(1)
  10. print("end!")
  11. def test01(self):
  12. print("执行测试用例01")
  13. def test03(self):
  14. print("执行测试用例03")
  15. def test02(self):
  16. print("执行测试用例02")
  17. def addtest(self):
  18. print("add方法")

执行结果:

  1. start!
  2. 执行测试用例01
  3. end!
  4. start!
  5. 执行测试用例02
  6. .end!
  7. start!
  8. 执行测试用例03
  9. ..
  10. end!
  11. ----------------------------------------------------------------------
  12. Ran 3 tests in 3.002s
  13. OK

先执行的前置setUp,然后执行的用例(test),最后执行的后置tearDown

测试用例(test
)的执行顺序是根据01-02-03执行的,也就是说根据用例名称来顺序执行的

addtest(self)这个方法没执行,说明只执行test开头的用例

unittest 的断言:

在测试用例中,执行完测试用例后,最后一步是判断测试结果是pass还是fail,自动化测试脚本里面一般把这种生成测试结果的方法称为断言(assert)。

用unittest组件测试用例的时候,断言的方法还是很多的,下面介绍几种常用的断言方法:assertEqual、assertIn、assertTrue

  1. #!/usr/bin/env python
  2. # coding=utf-8
  3. import unittest
  4. import time
  5. class Test(unittest.TestCase):
  6. def test01(self):
  7. '''判断 a == b '''
  8. a = 1
  9. b = 1
  10. self.assertEqual(a, b)
  11. def test02(self):
  12. '''判断 a in b '''
  13. a = "hello"
  14. b = "hello world!"
  15. self.assertIn(a, b)
  16. def test03(self):
  17. '''判断 a is True '''
  18. a = True
  19. self.assertTrue(a)
  20. def test04(self):
  21. '''失败案例'''
  22. a = "上海wing"
  23. b = "wing"
  24. self.assertEqual(a, b)
  25. if __name__ == '__main__':
  26. unittest.main()

执行结果:

  1. Traceback (most recent call last):
  2. File "G:/boke/boke.py", line 24, in test04
  3. self.assertEqual(a, b)
  4. AssertionError: '上海wing' != 'wing'
  5. - 上海wing
  6. ? --
  7. + wing
  8. ----------------------------------------------------------------------
  9. Ran 4 tests in 0.001s
  10. FAILED (failures=1)

assertEqual分析:

1.以assertEqual为例分析:

assertEqual(self, first, second, msg=None)

Fail if the two objects are unequal as determined by the ''

operator.

2.翻译:如果两个对象不能相等,就返回失败,相当于return: firstsecond

3.这里除了相比较的两个参数first和second,还有第三个参数msg=None,这个msg参数就是遇到异常后自定义输出信息

  1. raceback (most recent call last):
  2. File "G:/boke/boke.py", line 24, in test04
  3. self.assertEqual(a, b)
  4. AssertionError: '上海wing' != 'wing'
  5. - 上海wing
  6. ? --
  7. + wing
  8. ----------------------------------------------------------------------
  9. Ran 4 tests in 0.001s
  10. FAILED (failures=1)

unittest 常用的断言:

1.assertEqual(self,first,second,msg=None)

判断两个参数相等:first == second

2.assertNotEqual(self,first,second,msg=None)

判断两个参数不相等:first != second

3.assertIn(self,member,container,msg=None)

判断是字符串是否包含:member in container

4.assertNotIn(self, member, container, msg=None)

--判断是字符串是否不包含:member not in container

5.assertTrue(self, expr, msg=None)

--判断是否为真:expr is True

6.assertFalse(self, expr, msg=None)

--判断是否为假:expr is False

7.assertIsNone(self, obj, msg=None)

--判断是否为None:obj is None

8.assertIsNotNone(self, obj, msg=None)

--判断是否不为None:obj is not None

案例:



以一下抓包接口为例:

运单号为:1202247993797

快递公司为:韵达

http://www.kuaidi.com/index-ajaxselectcourierinfo-1202247993797-yunda.html

  1. #!/usr/bin/env python
  2. # coding=utf-8
  3. import unittest
  4. import time
  5. import unittest
  6. import requests
  7. class Test_Kuaidi(unittest.TestCase):
  8. def setUp(self):
  9. self.headers = {
  10. "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:44.0) Gecko/20100101 Firefox/44.0"} # get方法其它加个ser-Agent就可以了
  11. def test_yunda(self):
  12. danhao = '1202247993797'
  13. kd = 'yunda'
  14. # 这里对url的单号参数了
  15. self.url = "http://www.kuaidi.com/index-ajaxselectcourierinfo-%s-%s.html" % (danhao, kd)
  16. print(self.url)
  17. # 第一步发送请求
  18. r = requests.get(self.url, headers=self.headers, verify=False)
  19. result = r.json()
  20. # 第二步获取结果
  21. print(result['company']) # 获取公司名字
  22. data = result['data'] # 获取data里面的内容
  23. print(data[0]) # 获取data里面最上边一个
  24. get_result = data[0]['context'] # 获取已经签收的状态
  25. print(get_result)
  26. # 断言:测试结果和期望结果的比较
  27. self.assertEqual(u'韵达快递', result['company'])
  28. self.assertIn(u'已签收', get_result)
  29. def test_tiantian(self):
  30. danhao = '560697415000'
  31. kd = 'tiantian'
  32. # 这里对url的单号参数了
  33. self.url = "http://www.kuaidi.com/index-ajaxselectcourierinfo-%s-%s.html" % (danhao, kd)
  34. print(self.url)
  35. # 第一步发送请求
  36. r = requests.get(self.url, headers=self.headers, verify=False)
  37. result = r.json()
  38. # 第二步获取结果
  39. print(result['company']) # 获取公司名字
  40. data = result['data'] # 获取data里面的内容
  41. print(data[0]) # 获取data里面最上边一个
  42. get_result = data[0]['context'] # 获取已经签收的状态
  43. print(get_result)
  44. # 断言:测试结果和期望结果的比较
  45. self.assertEqual(u'韵达快递', result['company'])
  46. self.assertIn(u'已签收', get_result)
  47. if __name__ == '__main__':
  48. unittest.main()

登陆接口

以博客园的登陆接口为案例:

参考代码如下:

批量执行discover

一、例如:如图在自己的工作目录下,创建一个文件叫:runn_all.py

二、discover加载测试用例

1.discover方法里面有三个参数:

-case_dir:这个是待执行用例的目录。

-pattern:这个是匹配脚本名称的规则,test*.py意思是匹配test开头的所有脚本。

-top_level_dir:这个是顶层目录的名称,一般默认等于None就行了。

2.discover加载到的用例是一个list集合,需要重新写入到一个list对象testcase里,这样就可以用unittest里面的TextTestRunner这里类的run方法去执行。

例如:代码如下:(run_all.py)自己的项目中用到的,大家可以直接拿过来用;(注意报告或者testcase的文件名字,大家自行修改)

  1. #!/usr/bin/env python
  2. # coding=utf-8
  3. import unittest
  4. import os
  5. import HTMLTestRunner
  6. # 用例路径
  7. case_path = os.path.join(os.getcwd(), "test_data")
  8. print(case_path)
  9. # 报告存放路径
  10. report_path = os.path.join(os.getcwd(), "test_report")
  11. print(report_path)
  12. def all_case():
  13. discover = unittest.defaultTestLoader.discover(case_path,
  14. pattern="test*.py",
  15. top_level_dir=None)
  16. print(discover)
  17. return discover
  18. if __name__ == "__main__":
  19. # runner = unittest.TextTestRunner()
  20. # runner.run(all_case())
  21. # html报告文件路径
  22. report_abspath = os.path.join(report_path, "result.html")
  23. fp = open(report_abspath, "wb")
  24. runner = HTMLTestRunner.HTMLTestRunner(stream=fp,
  25. title=u'自动化测试报告,测试结果如下:',
  26. description=u'用例执行情况:')
  27. # 调用add_case函数返回值
  28. runner.run(all_case())
  29. fp.close()

上述的代码也包含了生成html报告的文件:

批量执行完用例后,生成的测试报告是文本形式的,不够直观,为了更好的展示测试报告,最好是生成HTML格式的。

unittest里面是不能生成html格式报告的,需要导入一个第三方的模块:HTMLTestRunner

一、导入HTMLTestRunner

1.这个模块下载不能通过pip安装了,只能下载后手动导入,下载地址:http://tungwaiyip.info/software/HTMLTestRunner.html

2.Download下HTMLTestRunner.py文件就是我们需要下载的包。

3.下载后手动拖到python安装文件的Lib目录下

二、demo解析

1.下载Download下的第二个文件test_HTMLTestRunner.py,这个就是官方给的一个测试demo了,从这个文件可以找到该模块的用法。

2.找到下图这段,就是官方给的一个demo了,test_main()里上半部分就是加载测试case,我们不需要搞这么复杂。

3.最核心的代码是下面的红色区域,就行了,我们只用到这么多。

三、生成html报告

1.我们只需把上面红色区域代码copy到上一篇的基础上稍做修改就可以了,这里主要有三个参数:

--stream:测试报告写入文件的存储区域

--title:测试报告的主题

--description:测试报告的描述

2.report_path是存放测试报告的地址

  1. if __name__ == "__main__":
  2. # runner = unittest.TextTestRunner()
  3. # runner.run(all_case())
  4. # html报告文件路径
  5. report_abspath = os.path.join(report_path, "result.html")
  6. fp = open(report_abspath, "wb")
  7. runner = HTMLTestRunner.HTMLTestRunner(stream=fp,
  8. title=u'自动化测试报告,测试结果如下:',
  9. description=u'用例执行情况:')
  10. # 调用add_case函数返回值
  11. runner.run(all_case())
  12. fp.close()

四、查看报告:

五、邮件里如何显示:具体的用例名称:

六、我们只需要在case里面添加上具体的功能描述就好了;

python2的时候报告会出问题:

python2用HTMLTestRunner生成测试报告时,有中文输出情况会出现乱码,这个主要是编码格式不统一,改下编码格式就行。

下载地址:http://tungwaiyip.info/software/HTMLTestRunner.html

二、修改编码

1.找到HTMLTestRunner.py文件,搜索:uo =

2.找到红色区域设置编码的两个地方

3.注释掉红色区域这两个设置,重新添加编码格式为:uo = o.decode('utf-8') ue = e.decode('utf-8')

4.修改好之后记得保存,重新运行,乱码问题就解决了

三、python3报告问题

1.python3的小伙伴直接用这个下载地址:http://tungwaiyip.info/software/HTMLTestRunner.html的文件,是不能直接生成报告的,需要稍做修改

2.以及报告美化版本都在如下地址里面

统一下载后放到:C:\python3\Lib对应的目录下就好了

具体的地址放在:

https://pan.baidu.com/s/1lUncNHRMfc7InR4E7nyPqA

密码:nqej

pycharm运行的方式:

二、unittest运行整个脚本用例

1.如果想当前的脚本上所有的用例一起执行,只需把鼠标放到if name == "main":这句话的后面或者下方就行了

也可以鼠标直接放在:整个py 文件,然后运行;

也可以在命令行运行,大家自行研究一下

unittest测试的更多相关文章

  1. Python 下的unittest测试框架

    unittest测试框架,直接上图吧: data:数据:主要格式为CSV:读取方式:csv.reade: public:封装的模块:通用的模块单独封装,所需参数设置为变量: testcase:测试用例 ...

  2. 【转】python模块分析之unittest测试(五)

    [转]python模块分析之unittest测试(五) 系列文章 python模块分析之random(一) python模块分析之hashlib加密(二) python模块分析之typing(三) p ...

  3. python内置模块之unittest测试(五)

    系列文章 python模块分析之random(一) python模块分析之hashlib加密(二) python模块分析之typing(三) python模块分析之logging日志(四) pytho ...

  4. python利用unittest测试框架组织测试用例的5种方法

    利用unittest测试框架可以编写测试用例,执行方式分两大类:利用main方法和利用testsuite,其中利用测试套件来组织测试用例可以有4种写法. 在此之前,先了解几个概念 TestCase:所 ...

  5. unittest 测试

    unittest 测试 单元测试是用来对一个模块.一个函数或者一个类来进行正确性检验的测试工作. 比如对函数abs(),我们可以编写出以下几个测试用例: 输入正数,比如1.1.2.0.99,期待返回值 ...

  6. Python接口测试实战3(下)- unittest测试框架

    如有任何学习问题,可以添加作者微信:lockingfree 课程目录 Python接口测试实战1(上)- 接口测试理论 Python接口测试实战1(下)- 接口测试工具的使用 Python接口测试实战 ...

  7. <day002>Selenium基本操作+unittest测试框架

    任务1:Selenium基本操作 from selenium import webdriver # 通用选择 from selenium.webdriver.common.by import By # ...

  8. 基于Python的接口自动化-unittest测试框架和ddt数据驱动

    引言 在编写接口自动化用例时,我们一般针对一个接口建立一个.py文件,一条接口测试用例封装为一个函数(方法),但是在批量执行的过程中,如果其中一条出错,后面的用例就无法执行,还有在运行大量的接口测试用 ...

  9. unittest测试驱动之HTMLTestRunner.py

    对于自动化来说,测试报告是必须的,在敏捷化的团队中,团队中的成员需要自动化这边提供自动化的测试报告,来判断系统的整体质量以及下一步的测试策略.单元测试库生成测试输出到控制台的窗口上,但是这样的结果看起 ...

  10. (引用) unittest测试驱动之执行测试(三)

    转载:http://www.wtoutiao.com/p/ydeoyY.html 在unittest的模块中,提供了TestRunner类来进行运行测试用例,在实际的应用中,经常使用的是TextTes ...

随机推荐

  1. spark快速大数据分析

    从上层来看,每个Spark 应用都由一个驱动器程序(driver program)来发起集群上的各种并行操作.驱动器程序包含应用的main 函数,并且定义了集群上的分布式数据集,还对这些分布式数据集应 ...

  2. 白鹭引擎 - 对象的添加与删除 ( 开关效果 addChild, removeChild )

    class Main extends egret.DisplayObjectContainer { /** * Main 类构造器, 初始化的时候自动执行, ( 子类的构造函数必须调用父类的构造函数 ...

  3. js判断用户是客户端还是移动端

    js判断用户是客户端还是移动端 Javascript 判断客户端是否为 PC 还是手持设备,有时候项目中需要用到,很方便的源生检测,方法一共有两种   1.第一种: function IsPC() { ...

  4. NSNotification相关

    NSNotification处理过程是一个同步的过程.它的消息回调函数执行的线程跟发送消息代码(也就是postNotification)所在的线程相同,一个Notification发出后,在回调函数执 ...

  5. hadoop-2

    AsyncDispatcher,直接看代码 @Override protected void serviceStart() throws Exception { //start all the com ...

  6. c#与wpf的一些基础语法问题(摘用)

    1 .在vs里不同cs文件,位于同一个namespace,是什么情况. 答:http://msdn.microsoft.com/zh-cn/library/0d941h9d(v=vs.80).aspx ...

  7. Mybatis动态sql及性能优化-3

    内容简介 1.回顾 2.动态sql 3.性能优化 懒加载机制 一级缓存 二级缓存 一.回顾 1.config文件常用标签 properties标签:引入外部properties文件资源. settin ...

  8. Shell条件表达式

    Shell编程中经常需要判断文件状态.字符串是否相等以及两个数值大小等情况,基于这些比较结果再做执行相关操作.本文主要讲述文件状态.字符串.数值大小的判断比较方法. 文件状态判断 文件状态的判断通常使 ...

  9. C++ new 和malloc 区别

    1.分配地方不同,malloc是堆上面,new是自由存储区域 2.malloc/delete是函数,new/delete是操作符,可以重载 3.malloc 要指定大小,返回的是void*指针,开辟的 ...

  10. 四则运算之Right-BICEP单元测试

    一. 这篇博客要对上次实现的四则运算进行单元测试,一是检查上次的程序的实现情况,二是巩固单元测试的相关知识.本次进行单元测试用的是Riget-BICEP方法. Riget-BICEP方法: 1.Rig ...