Unittest原理及基本方法
python功能自动化测试框架很多,unittest是其中比较受欢迎的一个,工作中也会用到,所以分享下unittest的原理和使用方法。
unittest主要组成如下:
- Test Fixture:准备及清理工作。
- Test Case: 通常是使用assert方法检查动作和输入的响应,一般是基于TestCase类扩充。
- Test Suite:多个TestCase集合在一起,就是TestSuite,TestSuite还可以进行嵌套。
- Test Runner:测试执行。
- Test Result:包括运行了多少测试用例,成功了多少,失败了多少等信息。
首先通过查看unittest的源码,来看一下这几个概念,以及他们之间的关系,他们是如何在一起工作的,其静态类图如下:
整个流程是很清晰的,首先是要写好TestCase,然后由TestLoader加载TestCase到TestSuite,然后由TextTestRunner来运行TestSuite,运行的结果保存在TextTestResult中,整个过程集成在unittest.main模块中。
测试的基础就是TestCase,也就是用例的编写,用例的开始需要对测试做前期准备,用例结束则需清理环境,保证下一个用例在合适的环境下进行。
下面就以一个简单的例子,实践一下TestCase的基本实现方法:
- importrandom
- importunittest
- classTestSequenceFunctions(unittest.TestCase):
- def setUp(self):
- print(‘Test Start!’)
- self.seq = range(10)
- def test_shuffle(self):
- # make sure the shuffled sequence does not lose any elements
- shuffle(self.seq)
- self.seq.sort()
- self.assertEqual(self.seq, range(10))
- # should raise an exception for an immutable sequence
- self.assertRaises(TypeError, random.shuffle, (1,2,3))
- def test_choice(self):
- element = random.choice(self.seq)
- self.assertTrue(element in self.seq)
- def test_sample(self):
- with self.assertRaises(ValueError):
- sample(self.seq, 20)
- for element insample(self.seq, 5):
- self.assertTrue(element in self.seq)
- def tearDown(self):
- print(‘Test End!’)
- if__name__ == '__main__':
- main()
类TestSequenceFunctions包含继承自unittest.TestCase,重写了setUp()方法和tearDown()方法,打印语句以表明测试的开始和结束。TestSequenceFunctions还定义了三个以'test'开头的方法,,对每一个以test开头的方法,都为其构建了一个TestCase对象。方法都放在TestSequenceFunctions类中,是因为这几个测试用例的fixture是相同的(即setUp()和tearDown()),如果每一个测试用例单独写成一个TestCase的话,会有很多的冗余代码。
每一个方法里面可以写入断言语句,如assertEqual,assertTrue,assertRaises等,对测试的结果进行判断,并在测试完成后输出。
以上就是unittest的原理和基本实现方法。下一期,将继续学习如何生成HTML测试报告,更直观对测试情况进行了解,并通过邮件的方式发送测试报告。