unittest (python标准库-开发工具-单元测试框架)

 🔥 交流讨论:欢迎加入我们一起学习!

🔥 资源分享耗时200+小时精选的「软件测试」资料包

🔥 教程推荐:火遍全网的《软件测试》教程  

📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!

第一部分-使用

1、基本概念

1.1)unittest单元测试框架最初的灵感来自于JUnit,其特点有
  • 支持测试自动化
  • 为测试共享setup和shutdown代码
  • 可以把单个测试集合成测试用例集
  • 将测试报告框架和测试用例独立开来
1.2)unittest支持的面向对象的重要理念
  • test fixture
    测试固件:表示一个或多个测试用例需要的准备,以及关联的清理操作,例如:创建临时DB、目录或启动一个进程

  • test case
    测试用例: 一个独立的测试单元,它校验一组输入得到的一个指定的响应,unittest提供一个基类TestCase,用来创建新的测试用例

  • test suite
    测试套件: 一个测试用例的集合,用来集合应该被一起执行的测试用例

  • test runner
    测试执行组件: 安排测试的执行并给用户提供结果

2、简单实例

unittest库提供了一系列丰富的工具来构建和执行测试,下面讲一下可以满足大部分用户需求的一个小的工具子集

import unittest

class TestStringMethods(unittest.TestCase):

    def test_upper(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()
  • 测试用例继承TestCase类,单个测试方法需要已test开头,这样便于告诉test runner哪些方法代表测试用例
  • 每一个测试均用到了断言行数assert*(),以便于test runner计算测试结果及生成测试报告
  • setUp()和tearDown()方法用于定义一些测试前后的操作
  • unittest.main()为测试脚本提供了一个命令行接口来运行测试
3、命令行执行测试的方式
# 您可以像这样执行一个测试模块:
python -m unittest test_module1 test_module2
# 也可以执行一个测试类,如:
python -m unittest test_module.TestClass
# 或者单独执行一个测试方法
python -m unittest test_module.TestClass.test_method
4、组织测试代码
  • 测试用例: 单元测试的基础组成模块是 测试用例--必须建立起来并且完成正确性校验的单个场景
  • 编写用例的规范
    • 在unittest框架中,测试用例就是TestCase的实例,所以你必须继承TestCase类来写用例
    • 测试方法必须带self参数,用来单独运行或则组合运行用例
    • assert*()方法是TestCase类提供的,如果测试失败了,它会抛出解释性的说明,unittest则会把这个用例定义为失败,其他的异常都会被视为错误。
    • setUp()方法会在每一个test_func执行之前执行,同理的tearDown
    • 测试用例的执行顺序是测试方法名的字符串排序

自由组装测试套件

import unittest

class WidgetTestCase(unittest.TestCase):
	def setUp(self):
	self.widget = Widget('The widget')

	def tearDown(self):
	self.widget.dispose()

def suite():
    suite = unittest.TestSuite()
    suite.addTest(WidgetTestCase('test_default_widget_size'))
    suite.addTest(WidgetTestCase('test_widget_resize'))
    return suite

if __name__ == '__main__':
    runner = unittest.TextTestRunner()
    runner.run(suite())
5、跳过用例

5.1 跳过一个用例使用skip()装饰器就可以了,下面是几个实例

class MyTestCase(unittest.TestCase):

@unittest.skip("demonstrating skipping")
def test_nothing(self):
    self.fail("shouldn't happen")

@unittest.skipIf(mylib.__version__ < (1, 3),
                 "not supported in this library version")
def test_format(self):
    # Tests that work for only a certain version of the library.
    pass

@unittest.skipUnless(sys.platform.startswith("win"), "requires Windows")
def test_windows_support(self):
    # windows specific testing code
    pass  

第二部分-深入unittest APIs

1、Test cases 测试用例相关

unittest.TestCase(methodName="runTest")
  • TestCase类的实例展示了unittest宇宙中单元测试逻辑,这个类被设计为基类,由它的子类来实现特定的测试。
  • 这些子类实现test runner需要的接口,来让它控制测试用例和各个失败的检查和报告的测试方法
  • TestCase实例提供三类方法:
    • A: 用来运行测试: setUp() 、tearDown()、setUpClass()、tearDownClass()、run(result=None)、skipTest(reason)
    • B: 用来实现条件检查和报告失败assert*()
    • C: 一些查询信息的方法

2、Grouping tests 组织测试用例

unittest.TestSuite(tests=())

这个类代表一些单独测试用例或测试集的集合,TestSuite的对象有点像TestCase对象,除了它并不真正实现一个测试外,另外,它们用来集成需要一起运行的测试,下面是一些常用方法:

  • addTest(test) 向测试集中加入一个测试用例或测试集
  • addTests(tests) 添加多个test
  • run(result)运行suite关联的测试,收集测试结果放到result中
  • countTestCases()

3、Loading and running tests 加载并执行测试

class unittest.TestLoader
  • 用来通过测试类和或者测试模块创建测试集,这个类一般无需实例化,
  • 方法:
    • loadTestsFromTestCase(testCaseClass)
    • loadTestsFromModule(module, pattern=None)
    • loadTestsFromName(name, module=None)
    • loadTestsFromNames(names, module=None)
    • getTestCaseNames(testCaseClass)
    • discover(start_dir, pattern='test*.py', top_level_dir=None)
class unittest.TestResult
  • TestResult对象保存了测试集的测试结果
  • TestRunner.run()会返回一个TestResult实例,用于生成测试不报告用
    • 结果属性:errors、failures、skipped、testsRun
class unittest.TextTestResult(stream, descriptions, verbosity)
  • 用TextTestRunner对TestResult的实现
  • 方法:
    • _makeResult():通过运行run函数返回一个TestResult实例。
    • run(test): TextTestRunner的主入口,以TestSuite或TestCase为参数,并输出一个TestResult
    • unittest.main(*):一个从module中载入测试集并执行他们的命令行程序,为了方便测试模块执行。最简单的执行方式是:

--

# 执行一个module中的所有用例 
if __name__ == '__main__':
	unittest.main()

4、 Class and Module Fixtures

  • class及module级别的固件(Fixture)在测试套件TestSuite中已经实现, 当suite遇到一个新类中的测试用例时,前一个类先tearDown且新的类会setUp固件。Shared fixtures

最后我邀请你进入我们的【软件测试学习交流群:785128166】, 大家可以一起探讨交流软件测试,共同学习软件测试技术、面试等软件测试方方面面,还会有免费直播课,收获更多测试技巧,我们一起进阶Python自动化测试/测试开发,走向高薪之路

作为一个软件测试的过来人,我想尽自己最大的努力,帮助每一个伙伴都能顺利找到工作。所以我整理了下面这份资源,现在免费分享给大家,有需要的小伙伴可以关注【公众号:程序员二黑】自提!

  • 11
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值