软件工程(2019)第二次作业
开发语言
鉴于Python语言比较简单,而且之前有过了解,并且想通过本次学习提高Python编程能力。
开发工具
之前对于Python的学习使用的是pycharm这个开发工具,其提供了一个带编码补全,代码片段,支持代码折叠和分割窗口的智能、可配置的编辑器,可帮助用户更快更轻松的完成编码工作。PyCharm不仅拥有一般IDE具备的功能,还提供了一些很好的功能用于Django开发,同时支持Google App Engine,更酷的是,PyCharm支持IronPython。所以我决定继续使用此开发工具。
Python单元测试框架unittest
Python中有一个自带的单元测试框架是unittest模块,用它来做单元测试,它里面封装好了一些校验返回的结果方法和一些用例执行前的初始化操作。
实例
1.首先准备一些待测方法,编写一个mathfun.py文件,定义了加减乘除四个函数,代码如下:
```
def add(a, b):
return a+b
def minus(a, b):
return a-b
def multi(a, b):
return a*b
def divide(a, b):
return a/b
2.接下来为这些方法写一个测试test_mathfun.py文件,代码如下:
import unittest
from mathfun import *
class TestMathFunc(unittest.TestCase):
"""Test mathfun.py"""
def test_add(self):
"""Test method add(a, b)"""
self.assertEqual(3, add(1, 2))
self.assertNotEqual(3, add(2, 2))
def test_minus(self):
"""Test method minus(a, b)"""
self.assertEqual(1, minus(3, 2))
def test_multi(self):
"""Test method multi(a, b)"""
self.assertEqual(6, multi(2, 3))
def test_divide(self):
"""Test method divide(a, b)"""
self.assertEqual(2, divide(6, 3))
self.assertEqual(2.5, divide(5, 2))
if name == 'main':
print()
unittest.main()
测试通过执行结果:
![](https://img2018.cnblogs.com/blog/1647785/201904/1647785-20190413133921532-12700791.png)
将self.assertEqual(2.5, divide(5, 2))改为self.assertEqual(2, divide(5, 2))
测试不通过执行结果:
![](https://img2018.cnblogs.com/blog/1647785/201904/1647785-20190413133850499-2040380865.png)
上面整个测试基本跑了下来,但可能会遇到点特殊的情况:如果测试需要在每次执行之前准备环境,或者在每次执行完之后需要进行一些清理添加了 setUp() 和 tearDown() 两个方法(其实是重写了TestCase的这两个方法),这两个方法在每个测试方法执行前以及执行后执行一次,setUp用来为测试准备环境,tearDown用来清理环境,已备之后的测试。
修改后的代码
import unittest
from mathfun import *
class TestMathFunc(unittest.TestCase):
"""Test mathfun.py"""
def setUp(self):
print("do something before test.Prepare environment.")
def tearDown(self):
print( "do something after test.Clean up.")
def test_add(self):
"""Test method add(a, b)"""
self.assertEqual(3, add(1, 2))
self.assertNotEqual(3, add(2, 2))
def test_minus(self):
"""Test method minus(a, b)"""
self.assertEqual(1, minus(3, 2))
def test_multi(self):
"""Test method multi(a, b)"""
self.assertEqual(6, multi(2, 3))
def test_divide(self):
"""Test method divide(a, b)"""
self.assertEqual(2, divide(6, 3))
self.assertEqual(2.5, divide(5, 2))
if name == 'main':
print()
unittest.main()
测试通过结果:
![](https://img2018.cnblogs.com/blog/1647785/201904/1647785-20190413134334349-1402456771.png)
将self.assertEqual(2.5, divide(5, 2))改为self.assertEqual(2, divide(5, 2))
测试不通过执行结果:
![](https://img2018.cnblogs.com/blog/1647785/201904/1647785-20190413134240731-501437131.png)
###总结一下:###
1.unittest是Python自带的单元测试框架,我们可以用其来作为我们自动化测试框架的用例组织执行框架。
2.unittest的流程:写好TestCase,然后由TestLoader加载TestCase到TestSuite,然后由TextTestRunner来运行TestSuite,运行的结果保存在TextTestResult中,我们通过命令行或者unittest.main()执行时,main会调用TextTestRunner中的run来执行,或者我们可以直接通过TextTestRunner来执行用例。
3.用 setUp()、tearDown()可以在用例执行前布置环境,以及在用例执行后清理环境。