一、UnitTest介绍

unittest单元测试框架不仅可以适用于单元测试,还可以适用WEB自动化测试用例的开发与执行,该测试框架可组织执行测试用例,并且提供了丰富的断言方法,判断测试用例是否通过,最终生成测试结果。

1.1、为什么使用UnitTest框架?

1. 能够组织多个用例去执行。

2. 提供丰富的断言方法。

3. 提供丰富的日志与测试结果。

1.2、如何使用UnitTest框架

1. 导包:import unittest             --> 导入unitest框架。

2. 继承:unittest.TestCase             --> 新建测试类需继承unittest.TestCase。

3.如果需要使用unittest的方法,需要重写该方法,如:setUp()、teraDown()、setUpClass()、tearDownClass。

二、unittest单元测试框架使用

1、TestCase类中定义的几个特殊方法

(1)setUp():每个测试方法运行前运行,测试前的初始化工作。

    def setUp(self):
self.a = 3
self.b = 1
print("查看setUp()方法执行顺序")
# @Author:lsj
# @version V1.0
# -*- coding:UTF-8 -*- import unittest
# 被测试类
class myclass(object):
@classmethod # 装饰器
def sum(cls,a,b):
return a + b # 将两个传入参数进行加粗操作
@classmethod
def sub(cls,a,b):
return a - b # 将两个传入参数进行相减 # 测试类
class mytest(unittest.TestCase):
def setUp(self):
self.a = 3
self.b = 1
print("查看setUp()方法执行顺序")
def testsum(self):
# 断言:两个数之和是否为4
self.assertEqual(myclass.sum(self.a,self.b),4,'test sum fail')
print("testsum方法")
def testsub(self):
# 断言两个数之差的结果是否为2
self.assertEqual(myclass.sub(self.a,self.b),2,'test sub fail')
print('testsub方法')
if __name__=='__main__':
unittest.main()

setUp()的执行顺序

"D:\Program Files\Python36\python.exe" D:/pycharm/qianyan/test_case/unitestshili.py
查看setUp()方法执行顺序
testsub方法
查看setUp()方法执行顺序
testsum方法
..
----------------------------------------------------------------------
Ran 2 tests in 0.000s OK Process finished with exit code 0

执行结果

(2)tearDown():每个测试方法运行结束后运行,测试后的清理工作。

 # @Author:lsj
# @version V1.0
# -*- coding:UTF-8 -*- import unittest
# 被测试类
class myclass(object):
@classmethod # 装饰器
def sum(cls,a,b):
return a + b # 将两个传入参数进行加粗操作
@classmethod
def sub(cls,a,b):
return a - b # 将两个传入参数进行相减 # 测试类
class mytest(unittest.TestCase):
def setUp(self):
self.a = 3
self.b = 1
print("查看setUp()方法执行顺序")
def tearDown(self):
print("查看tearDown()方法执行顺序")
def testsum(self):
# 断言:两个数之和是否为4
self.assertEqual(myclass.sum(self.a,self.b),4,'test sum fail')
print("testsum方法")
def testsub(self):
# 断言两个数之差的结果是否为2
self.assertEqual(myclass.sub(self.a,self.b),2,'test sub fail')
print('testsub方法')
if __name__=='__main__':
unittest.main()

查看tearDown()状态

 "D:\Program Files\Python36\python.exe" D:/pycharm/qianyan/test_case/unitestshili.py
..
----------------------------------------------------------------------
Ran 2 tests in 0.001s OK
查看setUp()方法执行顺序
testsub方法
查看tearDown()方法执行顺序
查看setUp()方法执行顺序
testsum方法
查看tearDown()方法执行顺序 Process finished with exit code 0

执行结果

(3)setUpClass():所有的测试方法运行前运行,单元测试前期准备,必须使用 @classmethod装饰器进行修饰(装饰器的使用详见python),setUp()函数之前执行,整个测试过程只执行一次。比如:实例化浏览器、浏览器最大化、隐式等待设置

(4)tearDownClass():所有的测试方法运行结束后执行,单元测试后期清理,必须使用 @classmethod装饰器进行修饰,tearDown()之后执行,整个测试过程只执行一次。

 # @Author:lsj
# @version V1.0
# -*- coding:UTF-8 -*- import unittest
# 被测试类
class myclass(object):
@classmethod # 装饰器
def sum(cls,a,b):
return a + b # 将两个传入参数进行加粗操作
@classmethod
def sub(cls,a,b):
return a - b # 将两个传入参数进行相减 # 测试类
class mytest(unittest.TestCase):
@classmethod
def setUpClass(cls):
print("查看setUpClass()方法执行顺序")
@classmethod
def tearDownClass(cls):
print("查看tearDownClass()方法执行顺序")
def setUp(self):
self.a = 3
self.b = 1
print("查看setUp()方法执行顺序")
def tearDown(self):
print("查看tearDown()方法执行顺序")
def testsum(self):
# 断言:两个数之和是否为4
self.assertEqual(myclass.sum(self.a,self.b),4,'test sum fail')
print("testsum方法")
def testsub(self):
# 断言两个数之差的结果是否为2
self.assertEqual(myclass.sub(self.a,self.b),2,'test sub fail')
print('testsub方法')
if __name__=='__main__':
unittest.main()

setUpClass和tearDownClass

"D:\Program Files\Python36\python.exe" D:/pycharm/qianyan/test_case/unitestshili.py
查看setUpClass()方法执行顺序
查看setUp()方法执行顺序
testsub方法
查看tearDown()方法执行顺序
查看setUp()方法执行顺序
testsum方法
查看tearDown()方法执行顺序
查看tearDownClass()方法执行顺序
..
----------------------------------------------------------------------
Ran 2 tests in 0.000s OK Process finished with exit code 0

执行结果

2、用例执行

2.1、单一测试模块执行用例

2.1.1、启动单元测试:使用unittest.main()方法 ,用例执行顺序是按照方法名的ASCII码升序排列的

2.1.2、测试集合

1)将功能相关的测试用例组合到一起成为一个测试用例集,unittest框架中通过TestSuite类来组装所有的测试用例集。(也就是说,使用测试集合可以同时执行同一个py文件中的多个测试用例类)

2)TestLoader类:测试用例加载器,返回一个测试用例集合

3)loadTestsFromTestCase类:根据给定的测试类,获取其中的所有以‘test’开头的测试方法,并返回一个测试集合

4)TestSuite类:组装测试用例的实例,支持添加和删除用例,最后将传递给test runner进行测试执行

5)TextTestRunner类:测试用例执行类,其中Text 表示以文本形式输出测试结果

unittest运行错误:类名尽量不要用test/Test

问题:在执行文件的时候明明要执行一个类,却发现所有的类都被执行了。

针对这一问题如下解决办法:edit configurations-->选中python-->增加或修改一条记录

2.1.3、按照特定顺序执行测试用例

1)获取 TestSuite的实例对象:suite=unittest.TestSuite()
2)将测试用例添加到测试容器中
  suite.addTest(mytest("test_1sub"))
  suite.addTest(mytest("test_2sum"))
3)创建TextTestRunner类的实例对象
  runner=unittest.TextTestRunner()
  runner.run(suite)

 # @Author:lsj
# @version V1.0
# -*- coding:UTF-8 -*- import unittest
# 被测试类
class myclass(object):
@classmethod # 装饰器
def sum(cls,a,b):
return a + b # 将两个传入参数进行加粗操作
@classmethod
def sub(cls,a,b):
return a - b # 将两个传入参数进行相减 # 测试类
class mytest(unittest.TestCase):
a = 3
b = 1
def test_2sum(self):
# 断言:两个数之和是否为4
self.assertEqual(myclass.sum(self.a,self.b),4,'test sum fail')
print("test_2sum方法")
def test_1sub(self):
# 断言两个数之差的结果是否为2
self.assertEqual(myclass.sub(self.a,self.b),2,'test sub fail')
print('test_1sub方法') class aa(unittest.TestCase):
def testaa(self):
print('testaa') if __name__=='__main__':
# 上面的代码可以替换成如下
# 1)获取 TestSuite的实例对象:将多个测试类加载到集合中
suite = unittest.TestSuite()
# 2)将测试用例添加到测试容器中
suite.addTest(mytest("test_2sum"))
# 查看其执行顺序
suite.addTest(aa('testaa'))
suite.addTest(mytest("test_1sub"))
# 3)创建TextTestRunner类的实例对象
runner = unittest.TextTestRunner()
runner.run(suite)

2.2、批量执行测试模块

# 批量执行测试模块(一)
# 加载当前目录下所有有效的测试模块,'.'表示当前目录
# 默认加载以test开头的py模块
# testSuite=unittest.TestLoader().discover('.')
# unittest.TextTestRunner(verbosity=2).run(testSuite)

# 批量执行测试模块(二)
# 指定路径及模块关键字 (举例: ../report:表示上一级目录中的report文件夹)
# 代码路径下,加载以lebo开头的py文件(*.py表示指定目录下所有以.py为后缀的文件)
testSuite = unittest.TestLoader().discover(start_dir='.', pattern='lebo_*.py')
unittest.TextTestRunner(verbosity=2).run(testSuite)

目录下需要被执行的测试脚本文件名必须以“test”字符串开头,比如 testEqual.py

2.3、忽略测试

2.3.1、无条件忽略:@unittest.skip('skipping')

2.3.2、有条件忽略:@unittest.skipIf(a>5,"condition is not satisfied!") 如果变量a大于5,则忽略该测试方法【表达式满足就跳过】

         @unittest.skipUnless(sys.platform=="linux","requires linux")如果执行测试用例的平台不是linux,则忽略测试方法【表达式不满足就跳过】

class aa(unittest.TestCase):
# num=2
# @unittest.skip('skipping')
# @unittest.skipIf(num>1,'num已经大于1')
@unittest.skipUnless(sys.platform == "linux", "requires linux")
def testaa(self):
print('testaa')

3、测试结果

3.1、. (点):执行成功,一个点表示一个测试方法。

3.2、F:执行失败,如断言失败(输出日志中 failures=1表示一条用例执行失败)。

3.3、E:用例本身有异常,如除数为零(输出日志中 errors=1表示一条用例异常)。

3.4、skipped:有几条用例被跳过执行,verbosity=0,

verbosity=1

verbosity=2

3.5、verbosity,日志输出情况

3.5.1、verbosity<=0 ,输出结果中不提示执行成功的用例数。

3.5.2、verbosity=1,输出结果中仅以点(.)表示执行成功的用例数。

3.5.3、verbosity>=2,可以输出每条用例执行的详细信息,特别是在大批量执行测试用例时,可以根据这些信息判断哪些用例执行失败。

4、断言

# @Author:lsj
# @version V1.0
# -*- coding:UTF-8 -*- import unittest
# print(unittest)
# 被测试类
class myclass(object):
@classmethod # 装饰器
def sum(cls,a,b):
return a + b # 将两个传入参数进行加粗操作
@classmethod
def sub(cls,a,b):
return a - b # 将两个传入参数进行相减 # 测试类
class mytest(unittest.TestCase):
a = 3
b = 1
# 具体的测试用例一定要以testk开头
def testsum(self):
# 断言:两个数之和是否为4
myclass.sum(self.a,self.b)
self.assertEqual(myclass.sum(self.a,self.b),4,'test sum fail')
# 判断3和4是否相等,不相等报错test sum fail
# self.assertEqual(3,4,'test sum fail')
print("testsum方法")
def testsub(self):
# 断言两个数之差的结果是否为2
self.assertEqual(myclass.sub(self.a,self.b),2,'test sub fail')
print('testsub方法') if __name__=='__main__':
unittest.main()
import unittest
import random #被测试类
class MyClass(object):
@classmethod
def sum(cls,a,b):
return a + b #将两个传入参数进行相加操作
@classmethod
def div(cls, a, b):
return a / b #将两个传入参数进行相除操作 @classmethod
def return_None(cls):
return None # 单元测试类
class MyTest(unittest.TestCase):
# assertEqual 方法实例
def test_assertEqual(self):
# 断言两数之和的结果
try:
a,b=1,2
sum=13
# assertEqual断言相等
self.assertEqual(a+b,sum,'断言失败,%s + %s !=%s' %(a,b,sum))
except AssertionError as e:
print(e) # assertNotEqual 方法实例
def test_assertNotEqual(self):
# 断言两数之差的结果
try:
a, b = 5,2
res = 3
# assertNotEqual断言不相等
self.assertNotEqual(a - b, res, '断言失败,%s - %s =%s' % (a, b, res))
except AssertionError as e:
print(e) # assertTrue 方法实例
def test_assertTrue(self):
# 断言表达式为真
try:
self.assertTrue(1==2, "表达式为假")
except AssertionError as e:
print(e) # assertFalse 方法实例
def test_assertFalse(self):
# 断言表达式为假
try:
self.assertFalse(3==3, "表达式为真")
except AssertionError as e:
print(e) # assertIs 方法实例
def test_assertIs(self):
# 断言两个变量类型属于同一个对象
try:
a = 12
b = a
self.assertIs(a , b,'%s 与 %s 不属于同一个对象' % (a, b))
except AssertionError as e:
print(e) # assertIsNot 方法实例
def test_assertIsNot(self):
# 断言两个变量类型不属于同一个对象(同一个内存空间)
try:
a = 12
b = 'test'
self.assertIsNot(a , b,'%s 与 %s 属于同一个对象' % (a, b))
except AssertionError as e:
print(e) # assertIsNone 方法实例
def test_assertIsNone(self):
# 断言表达式结果为None
try:
result=MyClass.return_None()
self.assertIsNone(result,'not is None')
except AssertionError as e:
print(e) # assertIsNotNone 方法实例
def test_assertIsNotNone(self):
# 断言表达式结果不为None
try:
result=MyClass.sum(2,5)
self.assertIsNotNone(result,'is None')
except AssertionError as e:
print(e) # assertIn 方法实例
def test_assertIn(self):
# 断言对象A是否包含在对象B中
try:
strA="this is a test"
strB="is"
self.assertIn(strB,strA,'%s 不包含在 %s中' %(strB,strA))
except AssertionError as e:
print(e) # assertNotIn 方法实例
def test_assertNotIn(self):
# 断言对象A不包含在对象B中
try:
strA="this is a test"
strB="Selenium"
self.assertNotIn(strB,strA,'%s 包含在 %s中' %(strB,strA))
except AssertionError as e:
print(e) if __name__=="__main__":
# 执行单元测试
# unittest.main()
testCase = unittest.TestLoader().loadTestsFromTestCase(MyTest)
# 将多个测试类加载到测试集合中
suite = unittest.TestSuite([testCase])
unittest.TextTestRunner(verbosity=1).run(suite)

Selenium3+python自动化010-UnitTest框架简介和单元测试框架使用的更多相关文章

  1. 前端测试框架对比(js单元测试框架对比)

    前端测试框架对比(js单元测试框架对比) 本文主要目的在于横评业界主流的几款前端框架,顺带说下相关的一些内容. 测试分类 通常应用会有 单元测试(Unit tests) 和 功能测试(Function ...

  2. web端自动化——Selenium3+python自动化(3.7版本)-火狐62版本环境搭建

    前言 目前selenium版本已经升级到3.0了,网上的大部分教程是基于2.0写的,所以在学习前先要弄清楚版本号,这点非常重要.本系列依然以selenium3为基础. 一.selenium简介 Sel ...

  3. web端自动化——Selenium3+python自动化(3.7版本)-chrome67环境搭建

    前言 目前selenium版本已经升级到3.0了,网上的大部分教程是基于2.0写的,所以在学习前先要弄清楚版本号,这点非常重要.本系列依然以selenium3为基础. 一.selenium简介 Sel ...

  4. Selenium3+python自动化006+自动化测试概述

    自动化测试概述 1.自动化分类: (1)单元测试自动化: 单元测试(Unit):模拟各种异常场景,外部依赖较少,且可以做测试单元到最小的一种测试方法. Java单元测试框架Junit.TestNG; ...

  5. selenium3+python自动化50-环境搭建(firefox)

    前言 有不少小伙伴在安装selenium环境后启动firefox报错,因为现在selenium升级到3.0了,跟2.0的版本还有有一点区别的. 安装环境过程中主要会遇到三个坑: 1.'geckodri ...

  6. selenium3+python自动化50-环境搭建(firefox)【转载】

    前言 有不少小伙伴在安装selenium环境后启动firefox报错,因为现在selenium升级到3.0了,跟2.0的版本还有有一点区别的. 安装环境过程中主要会遇到三个坑: 1.'geckodri ...

  7. Python unittest(PyUnit)单元测试框架

    PyUnit(unittest) 是 Python 自带的单元测试框架,用于编写和运行可重复的测试.PyUnit 是 xUnit 体系的一个成员,xUnit 是众多测试框架的总称,PyUnit 主要用 ...

  8. Python自动化运维之31、Tornado框架

    Tornado 官网:http://www.tornadoweb.org/en/stable/ Tornado 是 FriendFeed 使用的可扩展的非阻塞式 web 服务器及其相关工具的开源版本. ...

  9. pychrame更换默认以unittest执行或取消单元测试框架执行

    选择某个测试框架运行脚本 File-> Settings -> Tools -> Python Integrated Tools -> Default test runner ...

随机推荐

  1. Android中点击按钮启动另一个Activity以及Activity之间传值

    场景 点击第一个Activity中的按钮,启动第二个Activity,关闭第二个Activity,返回到第一个Activity. 在第一个Activity中给第二个Activity传递值,第二个Act ...

  2. 源码浅析:MySQL一条insert操作,会写哪些文件?包括UNDO相关的文件吗?

    DML操作的大致流程 在解答上述疑惑之前,我们来梳理一下DML操作的大致流程: 1.语法解析.语义解析 2.生成执行计划 3.事务修改阶段 1) 激活事务,事务状态由not_active变为activ ...

  3. kthrotlds(WatchDogs变种)查杀方法

    病毒现象 服务器出现卡顿.CPU飙升 以下为WatchDogs的判断方式及其命令:存在恶意进程watchdogs: ps -ef | grep watchdogs存在恶意进程ksoftirqds: p ...

  4. Centos7 安装Python3.7

    如果电脑自带的python2.7 先卸载 1.强制删除已安装python及其关联 rpm -qa|grep python|xargs rpm -ev --allmatches --nodeps 2.删 ...

  5. C#面向对象--结构

    一.结构(Struct)是CTS中五种基本类型之一,是一种值类型,同样封装了同属一个逻辑单元的数据和行为,这些数据和行为通过结构中的成员表示:结构与类共享大多数相同的语法,但结构比类受到的限制更多,结 ...

  6. 洛谷P3719 [AHOI2017初中组]rexp

    洛谷P3719 [AHOI2017初中组]rexp 题目背景 以下为不影响题意的简化版题目. 题目描述 给出一个由(,),|,a组成的序列,求化简后有多少个a. 化简规则: 1.形如aa...a|aa ...

  7. go 网络编程

    网络编程 tcp 1.tcp客户端服务端实现 server/server.go package main import ( "fmt" "net" ) /* t ...

  8. Mac下maven安装

    1.下载路径:https://maven.apache.org/download.cgi 要想查看历史版本:则点击archives. 点击binaries 就可以下载对应的maven. Binary ...

  9. webpack4从安装到使用入过的那些坑

    1.全局安装 安装 webpack 前要确保已经下载 node.js 最新版本(node.js官网地址) 目前使用命令行安装的 webpack 默认为最新版本(以下我使用了全局安装.官网建议本地安装, ...

  10. web攻击与防御

    攻击方式 利用输出值转义漏洞 跨站脚本攻击(XSS) SQL注入攻击 OS命令注入攻击 HTTP首部注入攻击 邮件首部注入攻击 文件目录遍历攻击 利用设置或设计缺陷 强制游览 开放重定向 不正确的错误 ...