unittest单元测试框架

重要的概念

1. TestCase
TestCase 是最小的测试单元,用于检查特定输入集合的特定返回值。unittest提供了TestCase基类,我们创建的测试类需要继承该基类,它可以用来创建新的测试用例
2. TestSuite
测试套件是测试用例、测试套件或两者的集合,用于组装一组要运行的测试。unittest提供了TestSuite类来创建测试套件
3. Test Runner
Test Runner是一个组件,用于协调测试的执行并向用户提供结果。unittest提供了TextTestRunner类运行测试用例
4. TestFixture
TestFixture代表执行一个或多个测试所需的环境准备,以及关联的清理动作。uinttest提供了setUp( )/tearDown( )、setUpClass( )/tearDownClass( )

TestSuite

调用TestSuite类下面的addTest( )来添加测试用例。因为一次只能添加一条用例,所以需要指定测试类及测试方法

suit = unittest.TestSuite()
suit.addTest(Calculator("test_add"))
suit.addTest(Calculator("test_sub"))

1. 通过测试套件添加顺序可以控制测试用例的执行顺序
2. 当一个测试文件中有很多测试用例时,并不是每次都要执行所有的测试用例,因而可以通过测试套件和运行器可以灵活的控制要执行的测试用例

discover方法

unittest提供了defaultTestLoader类中的discover( )方法,可以从多个文件中查找测试用例

discover(start_dir,pattern="test*.py",top_level_dir=None )

1. start_dir:待测试的模块名或测试用例目录
2. pattern="test*.py":测试用例文件名的匹配原则。此处匹配文件名以"test"开头的“.py”类型的文件,星号“*”表示任意多个字符
3. top_level_dir=None:测试模块的顶层目录,如果没有顶层目录,则默认为None

import unittest
# 定义测试用例的目录为当前目录中的test_case目录
test_dir = r"./test_case"
suit = unittest.defaultTestLoader.discover(test_dir,pattern="test*.py") if __name__ == "__main__":
runner = unittest.TextTestRunner()
runner.run(suit)

如果将discover( )方法中的start_dir 参数定义为“./test_case目录,那么只能加载test_a.py文件中的测试用例。如果想让unittest查找test_case/下子目录中的测试文件,需要在每个子目录下放一个__init__.py文件。__init__.py文件的作用是将一个目标标记成一个标准的Python模块

跳过测试和预期失败

在运行测试时,有时需要直接跳过某些测试用例,或则当测试用例符合某个条件时跳过测试,又或者直接将测试用例设置为失败。unittest提供了实现这些需求的装饰器

unittest.skip(reason)
无条件的跳过装饰的测试,需要说明跳过测试的原因
unittest.skipIf(condition,reason)
如果条件为真,则跳过装饰的测试
unittest.skipUnless(condition,reason)
当条件为真时,执行装饰的测试
unittest.expectedFailure()
不管执行结果是否失败,都将测试标记为失败

import unittest

class Mytest(unittest.TestCase):
@unittest.skip("直接跳过测试")
def test_skip(self):
print("aaa") @unittest.skipIf(3 > 2 ,"条件为真,跳过测试")
def test_skipIf(self):
print("bbb") @unittest.skipUnless(3 > 2,"条件为真,执行用例")
def test_skipUnless(self):
print("ccc") @unittest.expectedFailure
def test_expectedFailure(self):
self.assertEqual(2,3) if "__name__" == "__main__":
unittest.main()

执行结果

Skipped: 直接跳过测试

Skipped: 条件为真,跳过测试
ccc Ran 4 tests in 0.006s OK (skipped=2, expected failures=1)

单元测试部分代码:

1. 创建一个calculator.py文件

class Calculator:

    def __init__(self,a,b):
self.a = int(a)
self.b = int(b) def add(self):
return self.a + self.b def sub(self):
return self.a - self.b def mul(self):
return self.a * self.b def div(self):
return self.a / self.b

2. 通过unittest单元测试框架编写测试用例

import unittest
from Calculator import Calculator class TestCalculator(unittest.TestCase):
def test_add(self):
c = Calculator(3,5) # type(c):<class 'Calculator.Calculator'>
result = c.add() # type(result):<class 'int'>
self.assertEqual(result,8) def test_sub(self):
c = Calculator(13,5)
result = c.sub()
self.assertEqual(result, 8) def test_mul(self):
c = Calculator(2,3)
result = c.mul()
self.assertEqual(result,5) def test_div(self):
c = Calculator(6,3)
result = c.div()
self.assertEqual(result,2) if __name__ == "__main__":
unittest.main()

3. 创建测试套件跟测试运行器

import unittest
from Calculator import Calculator class TestCalculator(unittest.TestCase):
# 测试用例前置动作
def setUp(self):
print("test start:")
# 测试用例后置动作
def tearDown(self):
print("test end:") def test_add(self):
c = Calculator(3,5) # type(c):<class 'Calculator.Calculator'>
result = c.add() # type(result):<class 'int'>
self.assertEqual(result,8) def test_sub(self):
c = Calculator(13,5)
result = c.sub()
self.assertEqual(result, 8) def test_mul(self):
c = Calculator(2,3)
result = c.mul()
self.assertEqual(result,5) def test_div(self):
c = Calculator(6,3)
result = c.div()
self.assertEqual(result,2) if __name__ == "__main__":
# 创建测试套件
suit = unittest.TestSuite()
suit.addTest(Calculator("test_add"))
suit.addTest(Calculator("test_sub"))
suit.addTest(Calculator("test_mul"))
suit.addTest(Calculator("test_div"))
# 创建测试运行器
runner = unittest.TextTestRunner()
runner.run(suit)

最新文章

  1. Entity framewok 如何实现多条记录作为一条取出, for xml path如何实现
  2. java嵌套类
  3. 在mahout安装目录下输入mahout 提示 ERROR: Could not find mahout-examples-*.job
  4. shell 控制输出格式 echo printf
  5. 同步文本框内容的JS代码
  6. JS模态窗口返回值兼容问题解决方案
  7. java---一元二次方程练习
  8. dblink应用
  9. LeetCode16 3Sum Closest
  10. uva 11468 Substring
  11. 用jquery修改默认的单选框radio或者复选框checkbox选择框样式
  12. pearl(二分查找,stl)
  13. Weka开发[3]-Evaluation类
  14. TF-IDF 提取关键词
  15. 上海市2019年公务员录用考试第一轮首批面试名单(B类)
  16. 阿里巴巴Java开发手册- 控制语句
  17. Git 最新版本2.20.1 安装及配置
  18. SQL面试题(网络收集)
  19. 【第二章】MySQL数据库基于Centos7.3-部署
  20. Json映射为Map,避免定义过多pojo类

热门文章

  1. 17.splash_case01
  2. 论文阅读-(CVPR 2017) Kernel Pooling for Convolutional Neural Networks
  3. NEERC 2015 Adjustment Office /// oj25993
  4. 2019-8-30-PowerShell-通过-WMI-获取系统安装的驱动
  5. JavaScript数组的2种定义方式
  6. C++内存字节对齐规则
  7. 开源的DirectUI界面开发库DUILIB试用demo (Win32程序)
  8. springboot与任务(异步任务)
  9. C# FTP上传下载(支持断点续传)
  10. System.Web.Mvc.HttpNotFoundResult.cs