unittest自动化测试框架_unittest批量加载用例

unittest自动化测试框架_unittest批量加载用例目录一、unittest简介二、基本概念三、unittest基础使用四、unitteest提供的各种断言方式五、unittest测试用例跳过执行六、总结一、unittest简介测试框架-unittest,相当于是一个python版的junit。python里面的单元测试框架除了unittest,还有一个pytest框架,这个实际上用的比较少,后面有空再继续介绍和分享。unittest单元测试框架不仅可以适用于单元测试,还可以适用WEB自动化测试用例的

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

目录

一、unittest简介

二、基本概念

三、unittest基础使用

四、unitteest提供的各种断言方式

五、unittest测试用例跳过执行

六、总结


一、unittest简介

unittest自动化测试框架_unittest批量加载用例

测试框架-unittest,相当于是一个 python 版的 junit。python 里面的单元测试框架除了 unittest,还有一个 pytest 框架,这个实际上用的比较少,后面有空再继续介绍和分享。unittest单元测试框架不仅可以适用于单元测试,还可以适用WEB自动化测

试用例的开发与执行,该测试框架可组织执行测试用例,并且提供了丰富的断言方法,判断测试用例是否通过,最终生成测试结果。查看其中文官网:docs.python.org/zh-cn/3/lib… 英文官网:docs.python.org/3/library/u…

Unittest支持的功能

  1. 支持测试自动化
  2. 配置共享
  3. 支持测试用例聚合到测试集中
  4. 测试与报告框架独立

Unittest使用方法

导入unittest模块:import unittest

测试类需要继承unitest.TestCase

测试用例必须以test开头

assert断言来判断测试结果

使用HTMLTestRunner生产测试报告

二、基本概念

1.unittest核心的四个概念

test fixture:一般用于准备及清理工作;

test case:通常是使用assert方法检查动作和输入的响应,一般是基于TestCase类扩充;

test suite:多个测试的集合;

test runner:测试执行;

2.unittest.TestCase:TestCase类,所有测试用例类继承的基本类

class TestDemo(unittest.TestCase)
复制代码

3.setupclass():必须使用@classmethod装饰器,所有test运行前执行一次

import unittest 

class TestDemo(unittest.TestCase): 
    @classmethod 
    def setupClass(cls): 
        print("hello world")
复制代码

4.tearDownClass():必须使用@classmethod装饰器,所有test运行完后执行一次

import unittest

class TestDemo(unittest.TestCase):
    @classmethod
    def tearDownClass(cls): 
        print("tearDownClass")
复制代码

5、setup():每个测试方法运行前执行

import unittest

class TestDemo(unittest.TestCase):
    def setUp(self): 
        print("setUp")
复制代码

6.teardown():每个测试方法运行完后执行

import unittest 

class TestDemo(unittest.TestCase): 
    def tearDown(self): 
        print("tearDown")
复制代码

7.每个测试方法均以test开头,否则是不被unittest识别的

import unittest 

class TestDemo(unittest.TestCase): 
    def test_case1(self): 
        print('test_case1')
复制代码

8.unittest.main():将一个单元测试模块变为可直接运行的测试脚本,main()方法使用TestLoader类来搜索所有包含在该模块中以test命名开头的测试方法,并自动执行他们。

        执行方法的默认顺序是:根据ASCII码的顺序加载测试用例,数字与字母的顺序为:0-9,A-Z,a-z。所以以A开头的测试用例方法会优先执行,以a开头会后执行。

9.unittest.TestSuite():创建测试套件。addTest()/addTests()方法是将测试用例添加到测试套件中

例如:将test_Demo1模块下的TestDemo1类下的test_case1测试用例添加到测试套件中

suite = unittest.TestSuite() suite.addTest(test_Demo1.TestDemo1('test_case1'))
复制代码

10.unittest.TestLoader():根据不同的条件加载测试用例,其中有几个方法:

unittest.TestLoader().loadTestsFromName()
unittest.TestLoader().loadTestsFromNames() 
unittest.TestLoader().loadTestsFromTestCase() 
unittest.TestLoader().loadTestsFromModule() 
unittest.TestLoader().discover()
复制代码

加载一个目录下所有的测试用例:通过测试加载器:加载测试用例套件或者测试用例

import unittest if __name__ == '__main__': 
    # discover发现 
    # 在punlic目录下寻找test_开头的py文件 
   suite=unittest.defaultTestLoader.discover("./public",pattern='test_*.py') 
   unittest.main(defaultTest="suite")
复制代码

例如:将test_case包下的test_Demo1模块下的TestDemo1类下的test_case1测试用例添加到测试套件中:

suite = unittest.TestSuite() 
suite.addTests(unittest.TestLoader().loadTestsFromName('test_case.test_Demo1.TestDemo1.test_case1'))
复制代码

11.unittest.defaultTestLoader():通过该类下面的discover()方法可自动根据测试目录test_dir匹配查找测试用例文件(test*.py),并将查找到的测试用例组装到测试套件中

discover=unittest.defaultTestLoader.discover(test_dir, pattern='test_*.py')
复制代码

12.unittest.TextTextRunner():通过该类下面的run()方法来运行suite所组装的测试用例,入参为suite测试套件

suite = unittest.TestSuite() 
suite.addTest(TestDemo('test_case1')) 
runner = unittest.TextTestRunner() 
runner.run(suite)

三、unittest基础使用

 1 # 导入unittest模块
 2 import unittest
 3 
 4 
 5 # 创建单元测试类,继承unittest.TestCase
 6 class testCase(unittest.TestCase):
 7 
 8     def setUp(self):
 9         print("case执行前")
10 
11     def tearDown(self):
12         print("case执行后")
13 
14     @classmethod
15     def setUpClass(cls):
16         print("对象执行前")
17 
18     @classmethod
19     def tearDownClass(cls):
20         print("对象执行后")
21 
22     # 测试用例
23     def test_01(self):
24         print("test01")
25 
26     def test_02(self):
27         print("test02")
28 
29 
30 if __name__ == '__main__':
31     unittest.main()
复制代码

运行结果

 1 对象执行前
 2 case执行前
 3 test01
 4 case执行后
 5 case执行前
 6 test02
 7 case执行后
 8 对象执行后
 9 
10 
11 Ran 2 tests in 0.002s
12 
13 OK
复制代码

这里包含的知识点:

unittest.Testcase 

        自己创建的单元测试类都要继承它,它是所有单元测试类的基类

setUp 

        用于每个测试用例执行前的初始化工作

        所有类中方法的入参为 self ,定义实例变量也要 self.变量 

tearDown 

        每个测试用例执行后的都会执行此方法

setUpClass 

        每个单元测试类运行前调用该方法,只会执行一次

        属于类方法,需要加上装饰器 @classmethod 

        默认入参是 cls ,指的就是“类对象”本身,其实和self没什么区别,用法一致

tearDownClass 

        每个单元测试类运行后调用该方法,只会执行一次

        属于类方法,需要加上装饰器 @classmethod 

测试用例

        必须以“test_”开头命名的方法,否则无法识别并执行

        方法里面需要有断言,才能在最后运行时有该用例的执行结果

        可包含多个测试用例

unittest.main()

        运行单元测试

        该命令会搜索当前module 下所有以 test开头的测试用例,并运行它们

        执行顺序是按照case的命名

四、unitteest提供的各种断言方式

 1 class testCase(unittest.TestCase):
 2 
 3     def test_03(self):
 4         # 断言 - 是否为True
 5         flag = True
 6         self.assertTrue(flag, msg="测试失败的信息,可不填")
 7 
 8     def test_04(self):
 9         # 断言 - 是否为False
10         flag = False
11         self.assertFalse(flag)
12 
13     def test_05(self):
14         # 断言 - 提供的两个参数是否相同(任意类型)
15         self.assertEqual("123", "123")  # 字符串
16         self.assertEqual({"a": 1}, {"a": 1})  # 字典
17         self.assertEqual([1, 2], [1, 2])  # 列表
18         self.assertEqual((1, 2), (1, 2))  # 元组
19         self.assertEqual({1, 2}, {1, 2})  # 集合
20 
21     def test_06(self):
22         # 断言 - 列表是否相同
23         self.assertListtEqual([1, 2], [1, 2])
24 
25     def test_07(self):
26         # 断言 - 字典是否相同
27         self.assertDictEqual({"a": 1}, {"a": 1})
28 
29     def test_08(self):
30         # 断言 - 元组是否相同
31         self.assertTupleEqual((1, 2), (1, 2))
32 
33     def test_09(self):
34         # 断言 - 集合是否相同
35         self.assertSetEqual({1, 2}, {1, 2})
复制代码

这是比较常见的断言方式,当然还有一些比较容易理解的断言方式就没有一一举例啦,具体可以看看下面列表

方法 等同于python里面的写法
assertEqual(a, b) a == b
assertNotEqual(a, b) a != b
assertTrue(x) bool(x) is True
assertFalse(x) bool(x) is False
assertIs(a, b) a is b
assertIsNot(a, b) a is not b
assertIsNone(x) x is None
assertIsNotNone(x) x is not None
assertIn(a, b) a in b
assertNotIn(a, b) a not in b
assertIsInstance(a, b) isinstance(a, b)
assertNotIsInstance(a, b) not isinstance(a, b)
assertRegex(s, r) r.search(s)

五、unittest测试用例跳过执行

 1 class testCase(unittest.TestCase):
 2 
 3     # 直接跳过
 4     @unittest.skip("直接跳过")
 5     def test_skip(self):
 6         self.fail("shouldn't happen")
 7 
 8     # 满足condition则跳过
 9     @unittest.skipIf(1 < 2, "满足condition则跳过")
10     def test_skipIf(self):
11         print("skip if")
12 
13     # 不满足condition则跳过
14     @unittest.skipUnless(sys.platform.startswith("win"), "需要window平台才不会跳过")
15     def test_skipUnless(self):
16         print("skip Unless")
17 
18     # 预计该测试用例会测试失败
19     @unittest.expectedFailure
20     def test_fail(self):
21         self.assertEqual(1, 0, "broken")
22 
23     # 方法体内跳出不执行case
24     def test_maybe_skipped(self):
25         if True:
26             self.skipTest("调用unittest的skipTest,在方法体内满足某些条件则跳过该case")
27         pass
复制代码

运行结果

 1 Skipped: 调用unittest的skipTest,在方法体内满足某些条件则跳过该case
 2 
 3 Skipped: 直接跳过
 4 
 5 Skipped: 满足condition则跳过
 6 skip Unless
 7 
 8 
 9 Ran 5 tests in 0.010s
10 
11 OK (skipped=3, expected failures=1)
复制代码

跳过执行测试用例共有四种写法

         @unittest.skip(reason) :跳过测试用例,reason  为测试被跳过的原因

         @unittest.skipIf(condition, reason) :当 condition 为真时,跳过测试用例。

         @unittest.skipUnless(condition, reason) :跳过测试用例,除非 condition 为真

         @unittest.expectedFailure :把测试用例标记为预计失败;如果测试不通过,会被认为测试成功;如果测试通过了,则被认为是测试失败

self.skipTest(reason) 

在方法体内满足某些条件下才跳过执行该测试用例

跳过执行测试用例注意点

被跳过的测试的  setUp() 和  tearDown()  不会被运行

只输入 unittest.skip ,也可以正常跳过,不必写reason

若输入 unittest.skip() ,括号内必须写reason,不得为空

可以针对单元测试类级别设置跳过执行(在class声明上面直接加装饰器即可),该单元测试类所有测试用例不会被执行

被跳过的类的 setUpClass() 和 tearDownClass() 不会被运行

当方法体内调用了 self.skipTest(reason) 方法,该测试用例还是会调用 setUp() 和 tearDown() 

六、总结

本期,我们对Python提供的unittest单元测试模块,对其工作原理以及unittest执行步骤进行了解和学习。

我们在写自动化用例后,可以使用unittest测试验证我们用例正确和稳定性。

以上是本期内容,欢迎大佬们评论区写出你们的问题,下期见~

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/182104.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • Java安全之Cas反序列化漏洞分析

    Java安全之Cas反序列化漏洞分析0x00前言某次项目中遇到Cas,以前没接触过,借此机会学习一波。0x01Cas简介CAS是Yale大学发起的一个开源项目,旨在为Web应用

    2021年12月13日
  • hash 哈希算法_哈希一致性算法

    hash 哈希算法_哈希一致性算法文章目录一、哈希函数定义特点应用常见哈希算法二、murmurhash定义特点应用介绍三、MurmurHash使用四、性能测试MurmurHash:(multiplyandrotate)and(multiplyandrotate)Hash,乘法和旋转的hash算法。一、哈希函数定义散列函数(英语:Hashfunction)又称散列算法、哈希函数,是一种从任何一种数据中创建小的数字“指纹”的方法。散列函数把消息或数据压缩成摘要,使得数据量变小,将数据的格式固定下来。该函数将数据打乱混合

    2022年10月18日
  • 什么是网站的灵魂_测试性能网站

    什么是网站的灵魂_测试性能网站前言在前一篇随笔《大型网站系统架构的演化》中,介绍了大型网站的演化过程,期间穿插了一些技术和手段,我们可以从中看出一个大型网站的轮廓,但想要掌握设计开发维护大型网站的技术,需要我们一步一步去研究实践

  • 数据库分区概念及简单运用

    数据库分区概念及简单运用概念:数据库分区是一种物理数据库设计技术目的:主要目的是为了在特定SQL操作中减少数据读写的总量以缩短响应时间分类:分为水平分区(HorizontalParitioning)和垂直分区(VerticalPartitioning)水平分区:是对表的行进行分区,通过这种方式不同分组里面的物理列分隔的数据集得以组合,从而进行个体分隔(单分区)或集体分隔(1个或多个分区).所有表中定义的列在米格数据集中都能找到,所以表的特性依然得以保持。例如:一个包含十年发票记录的表可以被分区为十个不同..

  • NFV指的是_以致和以至的区别

    NFV指的是_以致和以至的区别这几年由于网路虚拟化技术的快速发展,很多网元设备都从传统的特定硬件转到通用硬件上的软件形态,那NFV和VNF这两个概念是有什么区别呢?NFV指网路功能虚拟化技术,通过IT虚拟化,实现传统通信网络的功能;VNF就是虚拟出来的一个个网元,实现某个网络功能单元,NF;NFV发展分为初级和高级阶段;初级阶段是基于传统硬件的软件执行环境转换为基于通用硬件的VM的专用虚拟化环境…

  • Nginx+DNS负载均衡「建议收藏」

    Nginx+DNS负载均衡「建议收藏」今天看了很多关于nginx负载均衡的博客,人家推荐的都是自己的ip来做负载,但是同样有说DNS负载均衡,刚开始我也是一头雾水,慢慢的分析才知道真正意义上的Nginx+DNS负载均衡。1.nginx负载均衡的5种策略(先了解这个后面的才好懂)轮询策略(默认)这种策略下每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。upstreambackserver{server192.168.0.14;server192.168.0.15;}指定

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号