简单使用Python Unittest写单元测试用例(转)

本文介绍如何使用Python自带的unittest库进行单元测试,包括创建测试类、编写测试方法和执行测试。通过实例演示了如何对一个简单的功能类进行单元测试,并提供了两种测试实现方式的对比。

简单使用Python Unittest写单元测试用例

作为开发人员,对写的代码进行单元测试是最基本的

对python语言来讲,其单元测试的利器是pyUnit, 这个从Python2.1之后的版本中,就已经是自带的了。

下面通过一个基本的例子来讲述如何来使用unittest.

首先是一个简单的功能。

area.py

  1. class Area:  
  2.     def __init__(self,width=100,length=100):  
  3.         self._width = width  
  4.         self._length = length  
  5.       
  6.     def getWidth(self):  
  7.         return self._width  
  8.   
  9.     def getLength(self):  
  10.         return self._length  
  11.   
  12.     def getArea(self):  
  13.         return self._width*self._length  
  14.   
  15.     def setWidth(self,width):  
  16.         if width <= 0:  
  17.             raise ValueError,"Illeage Width value"  
  18.         self._width = width  
  19.   
  20.     def setLenth(self,length):  
  21.         if length <= 0:  
  22.             raise ValueError,"Illeage Length value"  
  23.         self._length = length   

ut_area.py

  1. from area import Area  
  2. import unittest  
  3.   
  4. class AreaTestCase(unittest.TestCase):  
  5.     def setUp(self):  
  6.         self.area = Area()  
  7.       
  8.     def tearDown(self):  
  9.         self.area = None  
  10.       
  11.     def testArea(self):  
  12.         self.assertEqual(self.area.getArea(),10000)  
  13.       
  14.     def testWidth(self):  
  15.         self.area.setWidth(10)  
  16.         self.assertEqual(self.area.getWidth(),10)  
  17.     def testLength(self):  
  18.         self.area.setLenth(10)  
  19.         self.assertEqual(self.area.getLength(),10)  
  20.   
  21. if __name__ == "__main__":  
  22.     unittest.main()  

我们来看一下,单元测试的结果。

 

单元测试也可以以如下的方法来实现 

首先我们的测试类要继承于unittest.TestCase. 如果采用动态测试的方法可以为每个需要测试的方法编写测试方法,使用assertEqual( , ). 然后把我们的测试都放到unittest.TestSuite()容器中,最后使用 unittest.TextTestRunner().run(suite)方法自动测试。

  1. suite = unittest.TestSuite()  
  2.     suite.addTest(AreaTestCase("testArea"))  
  3.     suite.addTest(AreaTestCase("testWidth"))  
  4.     suite.addTest(AreaTestCase("testLength"))  
  5.   
  6.   
  7.     runner = unittest.TextTestRunner()  
  8.     runner.run(suite)  
  9.     print "#"*80  
  10.     unittest.main()  

我们把两种方法进行了对比,结果是一样的,

 

对TestCase,有以下的一些函数可以来使用

 

官方资料:http://docs.python.org/library/unittest.html

<think>嗯,用户想了解如何在Python使用unittest测试。首先,我需要回忆一下unittest的基本结构和常用方法。记得unittest是基于xUnit框架的,所以有TestCase类,测试方法要以test_开头,断言方法比如assertEqual、assertTrue这些。然后,可能需要提到如何组织测试,比如创建测试类继承unittest.TestCase,每个测试方法对应一个功能点。 接下来,用户可能想知道具体的步骤,比如如何导入模块,如何运行测试。记得setUp和tearDown方法,用于测试前的准备和测试后的清理,这部分也应该包含进去。还有,用户可能会关心如何分组测试使用TestLoader或者TestSuite,不过对于初学者来说,可能先讲基本用法更合适。 然后,想到用户可能需要示代码,这样更直观。比如一个简单测试,比如测试一个加法函数。然后展示如何运行测试使用unittest.main()或者在命令行执行。还要提到常用的断言方法,列出几个常见的,比如assertEqual、assertTrue、assertRaises等。 另外,用户可能不知道测试的结构,所以需要分步骤说明:导入unittest、创建测试类、编测试方法、使用断言。可能还需要解释为什么测试方法要以test_开头,因为unittest默认会检测这些方法。 还有,关于setUp和tearDown,可以举说明,比如数据库连接的建立和关闭。这部分对资源管理很重要,用户可能会遇到需要重复初始化的场景。 最后,可能需要提到一些高级用法,比如跳过测试、预期失败,或者参数化测试,但可能作为扩展内容,先满足用户的基本需求。然后根据引用内容,用户提供的引用里有提到创建测试文件,使用assertEqual,还有运行测试的方法,这些都需要整合到回答中。 总结一下,回答的结构应该是先介绍unittest的基本概念,然后分步骤讲解如何编测试,包括测试类、测试方法、断言,接着是setUp和tearDown的作用,最后展示示代码和运行方式。同时,要确保代码格式正确,使用中文解释清楚每个部分的作用,并可能生成相关问题,比如如何组织多个测试,如何测试异常情况等。</think>### 如何在 Python使用 unittest测试 #### 一、unittest 核心概念 1. **测试(TestCase)**:每个测试对应一个独立的测试场景,继承自`unittest.TestCase` 2. **断言方法**:用于验证代码行为是否符合预期,如`assertEqual(a, b)`、`assertTrue(x)` 3. **测试套件(TestSuite)**:用于组织多个测试的集合 4. **测试运行器(TestRunner)**:执行测试并输出结果 #### 二、编测试的步骤 1. **导入模块** ```python import unittest from mymodule import add, multiply # 被测函数 ``` 2. **创建测试类** ```python class TestMathOperations(unittest.TestCase): def setUp(self): """每个测试方法执行前的初始化操作""" self.test_data = [(2, 3), (0, 0), (-1, 5)] def test_add(self): """测试加法函数""" for a, b in self.test_data: self.assertEqual(add(a, b), a + b) def test_multiply_edge_case(self): """测试乘法边界条件""" self.assertEqual(multiply(0, 5), 0) self.assertEqual(multiply(-3, -4), 12) ``` 3. **添加断言示** ```python def test_type_check(self): with self.assertRaises(TypeError): # 验证异常抛出 add("2", 3) self.assertIsInstance(multiply(2.5, 3), float) # 类型检查 ``` 4. **运行测试** ```python if __name__ == '__main__': unittest.main() ``` #### 三、关键特性详解 1. **setUp/tearDown 生命周期**: - `setUp()`:每个测试方法执行前调用(适合初始化资源) - `tearDown()`:每个测试方法执行后调用(适合清理资源) - `setUpClass()`/`tearDownClass()`:整个测试类的初始化和清理 2. **跳过测试** ```python @unittest.skip("待实现") def test_divide(self): self.assertEqual(divide(6, 3), 2) ``` 3. **参数化测试**(需安装`parameterized`包) ```python from parameterized import parameterized class TestParameterized(unittest.TestCase): @parameterized.expand([ (1, 2, 3), (4, 5, 9) ]) def test_add(self, a, b, expected): self.assertEqual(add(a, b), expected) ``` #### 四、最佳实践 1. **测试命名规范**: - 测试类名:`Test[被测模块名]` - 测试方法名:`test_[被测方法]_[场景描述]` 2. **测试隔离**:每个测试方法应独立运行,不依赖其他测试结果 3. **测试覆盖率**:建议结合`coverage.py`确保关键路径覆盖[^3] #### 五、执行测试的多种方式 1. 命令行执行: ```bash # 执行单个模块 python -m unittest test_module.py # 发现并执行所有测试 python -m unittest discover -s tests -p "test_*.py" ``` 2. 生成HTML报告(需安装`html-testRunner`): ```python with open('report.html', 'wb') as f: runner = HTMLTestRunner(stream=f, title='测试报告') runner.run(test_suite) ``` ```python # 示被测函数(calculator.py) def add(a, b): return a + b def multiply(a, b): return a * b ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值