python单元测试框架unittest基本用法案例

目录
  • 案例1
  • 2、生成测试报告
  • 断言基本操作
  • 数据驱动 ddt data
  • 巩固
  • 总结

unittest是python单元测试框架,类似于JUnit框架

意义:

  • 灵活的组织ui接口测试自动化用例
  • 让用例高效的执行
  • 方便验证测试用例的结果
  • 集成html形式测试报告
  1. 一个class继承unittest.TestCase类,即是一个个具体的TestCase(类方法名称必须以test开头,否则不能被unittest识别)
  2. 每一个用例执行的结果的标识,成功是. ,失败为F,出错是E
  3. 每一个测试以test01、test02…依次写下去,unittest才可按照编号执行
  4. versity参数控制输出结果,0是简单报告、1是一般报告、2是详情报告。
  5. 用setUp()、terUpClass()以及tearDownClass()可以在用例执行前布置环境,以及在用例执行后清理环境。
  6. 参数中加stream,可以讲报告输出到文件:可以用HTMLTestRunner输出html报告。
  7. 多个单元的测试用例集合在一起,就是TestSuite。

案例1

from selenium import webdriver
import requests

def test01():
    '''
    用例1
    :return:
    '''
    url = "http://www.ynhousedata.cn/house/assessment/assess_public?token=9a5008072cfd7336350306fdd9ea9485&timestamp=2022-04-22 09:20:33&layer=1&total_layer=8&total_area=120&pre_id=4450"
    re = requests.get(url)
    print(re.status_code, re.text, re.headers, re.encoding)

def test02():
    '''
    用例1
    :return:
    '''
    driver = webdriver.Chrome()
    driver.get('https://www.baidu.com/')
    search = input('输入搜索内容\n')
    driver.find_element_by_xpath('//*[@id="kw"]').send_keys(search)
    driver.find_element_by_xpath('//*[@id="su"]').click()

test01()
test02()

以上测试,一旦test01出错,后边的代码无法执行,而且测试报告,不便于查阅。

import unittest

class TestCases(unittest.TestCase):

    @classmethod
    def setUpClass(cls) -> None:
        print('所有用例的前置')

    @classmethod
    def tearDownClass(cls) -> None:
        print('所有用例的后置')

    def setUp(self) -> None:
        print('每个用例前置')

    def tearDown(self) -> None:
        print('每个用例的后置')

    def test01(self):
        print('执行用例1')

    def test02(self):
        print('执行用例2')

if __name__ == '__main__':
    unittest.main()

运行结果

Ran 2 tests in 0.001s

OK
所有用例的前置
每个用例前置
执行用例1
每个用例的后置
每个用例前置
执行用例2
每个用例的后置
所有用例的后置

Process finished with exit code 0

若某个类下用例非常多,但又只想执行某一个,可以用以下方法

if __name__ == '__main__':
    # 创建套件对象
    suit = unittest.TestSuite()
    # 添加指定用例
    suit.addTest(TestCases("test02"))

    run = unittest.TextTestRunner()
    run.run(suit)

运行结果

所有用例的前置
每个用例前置
执行用例2
每个用例的后置
.所有用例的后置

----------------------------------------------------------------------
Ran 1 test in 0.000s

OK
<unittest.runner.TextTestResult run=1 errors=0 failures=0>

若某个类下用例非常多,以下运行方式可以执行多个用例

if __name__ == '__main__':
    # 创建套件对象
    suit = unittest.TestSuite()
    # 添加指定用例,多条
    suit.addTests([TestCases("test01"), TestCases("test02")])
    run = unittest.TextTestRunner()
    run.run(suit)

运行结果

所有用例的前置
每个用例前置
执行用例1
每个用例的后置
.每个用例前置
执行用例2
每个用例的后置
.所有用例的后置

----------------------------------------------------------------------
Ran 2 tests in 0.000s

OK
<unittest.runner.TextTestResult run=2 errors=0 failures=0>

当一个py文件下有多个类,需要执行某个类的时候,可以用以下方法执行

if __name__ == '__main__':
    # 创建套件对象
    suit = unittest.TestSuite()
    # 加载类
    load = unittest.TestLoader()
    suit.addTest(load.loadTestsFromTestCase(TestCases)) #TestCases为
    run = unittest.TextTestRunner()
    run.run(suit)

运行结果

所有用例的前置
每个用例前置
执行用例1
每个用例的后置
.每个用例前置
执行用例2
每个用例的后置
.所有用例的后置

----------------------------------------------------------------------
Ran 2 tests in 0.000s

OK
<unittest.runner.TextTestResult run=2 errors=0 failures=0>

当有多个测试类的时候,可以用以下方法执行

from selenium import webdriver
import requests
import unittest

class TestCases1(unittest.TestCase):

    @classmethod
    def setUpClass(cls) -> None:
        print('所有用例的前置')

    @classmethod
    def tearDownClass(cls) -> None:
        print('所有用例的后置')

    def setUp(self) -> None:
        print('每个用例前置')

    def tearDown(self) -> None:
        print('每个用例的后置')

    def test01(self):
        print('执行用例1')

    def test02(self):
        print('执行用例2')

class TestCases2(unittest.TestCase):

    @classmethod
    def setUpClass(cls) -> None:
        print('所有用例的前置')

    @classmethod
    def tearDownClass(cls) -> None:
        print('所有用例的后置')

    def setUp(self) -> None:
        print('每个用例前置')

    def tearDown(self) -> None:
        print('每个用例的后置')

    def test04(self):
        print('执行用例4')

    def test03(self):
        print('执行用例3')

if __name__ == '__main__':
    # 创建类加载对象
    load = unittest.TestLoader()
    # 分别加载两个类
    suit1 = load.loadTestsFromTestCase(TestCases1)
    suit2 = load.loadTestsFromTestCase(TestCases2)
    # 放在套件里
    suits = unittest.TestSuite([suit1, suit2])

    run = unittest.TextTestRunner()
    run.run(suits)

运行结果

所有用例的前置
每个用例前置
执行用例1
每个用例的后置
.每个用例前置
执行用例2
每个用例的后置
.所有用例的后置
所有用例的前置
每个用例前置
执行用例3
每个用例的后置
.每个用例前置
执行用例4
每个用例的后置
.所有用例的后置

----------------------------------------------------------------------
Ran 4 tests in 0.000s

OK
<unittest.runner.TextTestResult run=4 errors=0 failures=0>

当需要执行多个py文件下的类的用例的时候可以用以下方法

文件结构

➜  unitTest pwd 
/Users/lidong/Desktop/zhouyu/BILIBILI/笔记/unitTest,假设main.py执行testCase文件夹下的test*.py里的类
➜  unitTest tree
.
├── unitTest.md
├── __init__.py
├── main.py
└── testCase
    ├── test01.py
    └── test02.py

1 directory, 5 files

test01.py

import unittest

class TestCases1(unittest.TestCase):

    @classmethod
    def setUpClass(cls) -> None:
        print('所有用例的前置')

    @classmethod
    def tearDownClass(cls) -> None:
        print('所有用例的后置')

    def setUp(self) -> None:
        print('每个用例前置')

    def tearDown(self) -> None:
        print('每个用例的后置')

    def test01(self):
        print('执行用例1')

    def test02(self):
        print('执行用例2')

test02.py

import unittest

class TestCases2(unittest.TestCase):

    @classmethod
    def setUpClass(cls) -> None:
        print('所有用例的前置')

    @classmethod
    def tearDownClass(cls) -> None:
        print('所有用例的后置')

    def setUp(self) -> None:
        print('每个用例前置')

    def tearDown(self) -> None:
        print('每个用例的后置')

    def test04(self):
        print('执行用例4')

    def test03(self):
        print('执行用例3')

main.py

# -*- coding: utf-8 -*-
# @File : main.py
# @Author : 李东
# @Time : 2022/04/25 10:42:20

import unittest

test_dir = "/Users/lidong/Desktop/zhouyu/BILIBILI/笔记/unitTest"

report_path =
dis = unittest.defaultTestLoader.discover(test_dir, pattern="test*.py")

# 创建套件
suit = unittest.TestSuite()
# 添加套件用例
suit.addTest(dis)

run = unittest.TextTestRunner()
run.run(suit)

运行如下:

所有用例的前置
每个用例前置
执行用例1
每个用例的后置
.每个用例前置
执行用例2
每个用例的后置
.所有用例的后置
所有用例的前置
每个用例前置
执行用例3
每个用例的后置
.每个用例前置
执行用例4
每个用例的后置
.所有用例的后置

----------------------------------------------------------------------
Ran 4 tests in 0.000s

OK
<unittest.runner.TextTestResult run=4 errors=0 failures=0>

2、生成测试报告

进入网站,下载HTMLTestRunner文件

下载HTMLTestRunner链接

下载后修改文件,建议全部修改,如果报错,将不需要修改的地方还原即可。

 94行,import StringI0 ||| import io
 118行,self.fp.write(s) ||| self.fp.write(bytes(s,'UTF-8'))
 539行,self.outputBuffer = StringI0.StringI0() ||| self.outputBuffer = io.BytesI0()
 631行,print >>sys .stderr, '\nTime ELapsed: %s' % (self.stopTime-seLf.startTime) ||| print('\nTime Elapsed: %s' % (self.stopTime-self.startTime))
 642行,if not rmap.has_key(cls): ||| if not cls in rmap:
 766行,uo = o.decode('latin-1') ||| uo = o
 768行,uo = o ||| Uo = o.decode('utf-8')
 772行,ue = e.decode('latin-1') ||| ue=e
 774行,ue = e ||| ue = e.decode('utf-8')

修改完成之后,将文件放入到python环境的lib目录下(windows)。mac 用户可以放在****/lib/python3.9/site-packages目录下。

创建报告存放的文件夹report,报告目录结构如下

main.py定义如下

import unittest
import HTMLTestRunner
test_dir = "/Users/lidong/Desktop/zhouyu/BILIBILI/笔记/unitTest/testCase"
# 报告存放的位置
report_path = "/Users/lidong/Desktop/zhouyu/BILIBILI/笔记/unitTest/report/"
# 打开目录,生成html文件
file = open(report_path+'result.html', 'wb')
# 文件格式生成
run = HTMLTestRunner.HTMLTestRunner(stream=file, title='这是报告标题', description='这是报告描述')
# 加载用
dis = unittest.defaultTestLoader.discover(test_dir, pattern="test*.py")
# 运行用例
run.run(dis)

6、运行main.py之后,会在report目录下生成html报告

7、 使用浏览器打开,可以看到如下报告

断言基本操作

import unittest
import requests

class Tess(unittest.TestCase):
    def setUp(self):
        res = requests.get('http://www.baidi.com')
        return res.status_code

    def test1(self):
        # 判断获取的状态是否等于200
        self.assertEqual(self.setUp(), 200)

if __name__ == '__main__':
    unittest.main()

数据驱动 ddt data

import unittest
from ddt import ddt, data

@ddt
class TestCases2(unittest.TestCase):

    @classmethod
    def setUpClass(cls) -> None:
        print('所有用例的前置')

    @classmethod
    def tearDownClass(cls) -> None:
        print('所有用例的后置')

    def setUp(self) -> None:
        print('每个用例前置')

    def tearDown(self) -> None:
        print('每个用例的后置')

    @data('username01', 'username02')
    def test04(self, username):
        """冒烟用例"""
        print('执行用例4,',username,'登陆成功')

    def test03(self):
        """爆炸用例"""
        print('执行用例3')

if __name__ == '__main__':
    # 创建类加载对象
    load = unittest.TestLoader()
    # 分别加载两个类
    suit2 = load.loadTestsFromTestCase(TestCases2)
    # 放在套件里
    suits = unittest.TestSuite([suit2])

    run = unittest.TextTestRunner()
    run.run(suits)

运行结果

所有用例的前置
每个用例前置
执行用例3
每个用例的后置
.每个用例前置
执行用例4, username01 登陆成功
每个用例的后置
.每个用例前置
执行用例4, username02 登陆成功
每个用例的后置
.所有用例的后置

----------------------------------------------------------------------
Ran 3 tests in 0.000s

OK
<unittest.runner.TextTestResult run=3 errors=0 failures=0>

巩固

# -*- coding: utf-8 -*-,
# @File : test_module.py,
# @Author : lidong,
# @IDEA: PyCharm
# @Time :  2022/4/25 16:57

import unittest

class TestStringMethods(unittest.TestCase):

    a = 67

    # 跳过被此装饰器装饰的测试。 reason 为测试被跳过的原因。
    @unittest.skip('取消测试')
    def test_upper(self):
        print('test_upper')

   # 当condition为真时,跳过被装饰的测试。
    @unittest.skipIf(a>5, '取消测试')
    def test_upper2(self):
        print('test_upper2')

    #  跳过被装饰的测试,condition 为假
    @unittest.skipUnless(a > 88, '跳过被装饰的测试')
    def test_upper3(self):
        print('test_upper3')

    def test_upper5(self):
        self.assertEqual('foo'.upper(), 'FOO')

    def test_isupper(self):
        self.assertTrue('FOO'.isupper())
        self.assertFalse('Foo'.isupper())

    def test_split(self):
        s = 'hello world'
        self.assertEqual(s.split(), ['hello', 'world'])
        # check that s.split fails when the separator is not a string
        with self.assertRaises(TypeError):
            s.split(2)

if __name__ == '__main__':
    unittest.main()

运行

===============================================================================
[SKIPPED]
取消测试

unitTest.testCase.test_module.TestStringMethods.test_upper
unitTest.testCase.test_module.TestStringMethods.test_upper2
===============================================================================
[SKIPPED]
跳过被装饰的测试

unitTest.testCase.test_module.TestStringMethods.test_upper3
-------------------------------------------------------------------------------
Ran 6 tests in 0.093s

PASSED (skips=3, successes=3)

Process finished with exit code 0

Skipped: 取消测试

Skipped: 取消测试

Skipped: 跳过被装饰的测试

总结

到此这篇关于python单元测试框架unittest基本用法的文章就介绍到这了,更多相关python unittest用法内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Python Unittest自动化单元测试框架详解

    本文实例为大家分享了Python Unittest自动化单元测试框架的具体代码,供大家参考,具体内容如下 1.python 测试框架(本文只涉及 PyUnit) 参考地址 2.环境准备 首先确定已经安装有Python,之后通过安装PyUnit,Python版本比较新的已经集成有PyUnit(PyUnit 提供了一个图形测试界面UnittestGUI.py) 参考:查看地址 3.代码实例 使用的IDE为 PyCharm,DEMO结构如图 1.简单地一个实例 # Test002_Fail.py #

  • Python中unittest用法实例

    本文实例讲述了Python中unittest的用法,分享给大家供大家参考.具体用法分析如下: 1. unittest module包含了编写运行unittest的功能,自定义的test class都要集成unitest.TestCase类,test method要以test开头,运行顺序根据test method的名字排序,特殊方法: ① setup():每个测试函数运行前运行 ② teardown():每个测试函数运行完后执行 ③ setUpClass():必须使用@classmethod 装

  • Python单元测试框架unittest简明使用实例

    测试步骤 1. 导入unittest模块 import unittest 2. 编写测试的类继承unittest.TestCase class Tester(unittest.TestCase) 3. 编写测试的方法必须以test开头 def test_add(self) def test_sub(self) 4.使用TestCase class提供的方法测试功能点 5.调用unittest.main()方法运行所有以test开头的方法 复制代码 代码如下: if __name__ == '__

  • Python unittest 简单实现参数化的方法

    Python unittest 理论上是不建议参数驱动的,其用例应该专注单元测试,确保每个method的逻辑正确. 引用Stack Overflow的一个答案, "单元测试应该是独立的,没有依赖项的.这确保了每个用例都有非常具体而专一的测试反应.传入参数会破坏单元测试的这个属性,从而使它们在某种意义上无效.使用测试配置是最简单的方法,也是更合适的方法,因为单元测试不应该依赖外部信息来执行测试.那应该集成测试要做的." 但是实际操作过程中,时不时还是有控制入参的需求的.比如,我想简单实现

  • Python单元测试框架unittest使用方法讲解

    概述 1.测试脚手架(test fixture) 测试准备前要做的工作和测试执行完后要做的工作.包括setUp()和tearDown(). 2.测试案例(test case) 最小的测试单元. 3.测试套件(test suite) 测试案例的集合. 4.测试运行器(test runner) 测试执行的组件. 命令行接口 可以用命令行运行测试模块,测试类以及测试方法. 复制代码 代码如下: python -m unittest test_module1 test_module2 python -m

  • Python unittest单元测试框架的使用

    一.测试模型 下面这部分来自于某书籍资料,拿过来,按需参考一下: 测试模型 (1)线性测试 1.概念: 通过录制或编写对应应用程序的操作步骤产生的线性脚本.单纯的来模拟用户完整的操作场景.(操作,重复操作,数据)都混合在一起. 2.优点:每个脚本相对独立,且不产生其他依赖和调用.任何一个测试用例脚本拿出来都可以单独执行. 3.缺点:开发成本高,用例之间存在重复的操作.比如重复的用户登录和退出. 维护成本高,由于重复的操作,当重复的操作发生改变时,则需要逐一进行脚本的修改. 4.线性测试实例:用户

  • python单元测试unittest实例详解

    本文实例讲述了python单元测试unittest用法.分享给大家供大家参考.具体分析如下: 单元测试作为任何语言的开发者都应该是必要的,因为时隔数月后再回来调试自己的复杂程序时,其实也是很崩溃的事情.虽然会很快熟悉内容,但是修改和调试将是一件痛苦的事情,如果你在修改了代码后出现问题的话,而单元测试可以帮助我们很快准确的定位到问题的位置,出现问题的模块和单元.所以这是一件很愉快的事情,因为我们知道其它修改或没有修改的地方仍然是正常工作的,而我们目前的唯一问题就是搞定眼前这个有点问题的"家伙&qu

  • Python中Unittest框架的具体使用

    Unittest 1.环境 Unittest为Python内嵌的测试框架,不需要特殊配置,仅需要在File---settings---Tools----Python Intergrated Tools下配置框架为Unittest 2.编写规范 需要导入 import unittest 测试类必须继承unittest.TestCase 测试方法以 test_开头 模块和类名没有要求 3.Unittest介绍 import unittest def add(x, y): return x + y d

  • python单元测试框架unittest基本用法案例

    目录 案例1 2.生成测试报告 断言基本操作 数据驱动 ddt data 巩固 总结 unittest是python单元测试框架,类似于JUnit框架 意义: 灵活的组织ui接口测试自动化用例 让用例高效的执行 方便验证测试用例的结果 集成html形式测试报告 一个class继承unittest.TestCase类,即是一个个具体的TestCase(类方法名称必须以test开头,否则不能被unittest识别) 每一个用例执行的结果的标识,成功是. ,失败为F,出错是E 每一个测试以test01

  • 详解python单元测试框架unittest

    一:unittest是python自带的一个单元测试框架,类似于java的junit,基本结构是类似的. 基本用法如下: 1.用import unittest导入unittest模块 2.定义一个继承自unittest.TestCase的测试用例类,如 class abcd(unittest.TestCase): 3.定义setUp和tearDown,这两个方法与junit相同,即如果定义了则会在每个测试case执行前先执行setUp方法,执行完毕后执行tearDown方法. 4.定义测试用例,

  • python单元测试框架pytest的使用示例

    首先祝大家国庆节日快乐,这个假期因为我老婆要考注会,我也跟着天天去图书馆学了几天,学习的感觉还是非常不错的,这是一篇总结. 这篇博客准备讲解一下pytest测试框架,这个框架是当前最流行的python语言最流行的单测框架,不掌握可不行,首先这个框架属于第三方模块,需要通过pip安装即可 pip install pytest 下面我们进入正题 一.介绍pytest的运行规则 1.测试文件的名称必须要以test_*.py的格式,或者*_test.py的格式 2.测试类的名称必须要以Test开头,且这

  • Python 测试框架unittest和pytest的优劣

    一.Unittest Unittest是Python标准库中自带的单元测试框架,Unittest有时候也被称为PyUnit,就像JUnit是Java语言的标准单元测试框架一样,Unittest则是Python语言的标准单元测试框架. Unittest支持自动化测试,测试用例的初始化.关闭和测试用例的聚合等功能,它有一个很重要的特性:它是通过类(class)的方式,将测试用例组织在一起. 示例: 运行结果 注:unittest有一个关联模块unittest2,但unittest2仅适用于Pytho

  • python测试框架unittest和pytest区别

    一.用例编写规则 (1)unittest提供了test cases.test suites.test fixtures.test runner相关的类,让测试更加明确.方便.可控.使用unittest编写用例,必须遵守以下规则: 测试文件必须先import unittest 测试类必须继承unittest.TestCase 测试方法必须以"test_"开头 测试类必须要有unittest.main()方法 (2)pytest是python的第三方测试框架,是基于unittest的扩展框

  • python单元测试框架pytest介绍

    pytest是python语言中一款强大的单元测试框架,用来管理和组织测试用例,可应用在单元测试.自动化测试工作中. unittest也是python语言中一款单元测试框架,但是功能有限,没有pytest灵活. 就像:苹果电脑mac air和mac pro一样.都是具备同样的功能,但是好用,和更好用. 本文包含以下几个内容点: 1)pytest的简单示例 2)pytest的安装 3)pytest的特征.与unittest的区别. 4) pytest如何自动识别用例. 5)pytest框架中,用例

  • Python爬虫框架Scrapy基本用法入门教程

    本文实例讲述了Python爬虫框架Scrapy基本用法.分享给大家供大家参考,具体如下: Xpath <html> <head> <title>标题</title> </head> <body> <h2>二级标题</h2> <p>爬虫1</p> <p>爬虫2</p> </body> </html> 在上述html代码中,我要获取h2的内容,

  • python orm 框架中sqlalchemy用法实例详解

    本文实例讲述了python orm 框架中sqlalchemy用法.分享给大家供大家参考,具体如下: 一.ORM简介 1. ORM(Object-Relational Mapping,对象关系映射):作用是在关系型数据库和业务实体对象之间做一个映射. 2. ORM优点: 向开发者屏蔽了数据库的细节,使开发者无需与SQL语句打交道,提高了开发效率; 便于数据库的迁移,由于每种数据库的SQL语法有差别,基于Sql的数据访问层在更换数据库时通过需要花费时间调试SQL时间,而ORM提供了独立于SQL的接

随机推荐