自动化总结(二) Unittest的应用
自动化测试中,入门最快的应该是基于界面模拟用户操作的UI自动化,但是如果说实用性最高的当属接口自动化。但是不论是哪种自动化测试,都只存在细节上的差异,整体结构都是类似的。
如果将自动化脚本比作一个人,那么框架就是骨骼,驱动是肌肉,各类封装方法代表器官,参数是血液,最后的平台集成就是皮肤。
先说骨骼,也就是构建自动化测试的框架,当前主流的框架为Python的Unittest和Pytest、Java的JUnit和TestNG等等。Python语法和动态类型,以及解释型语言的本质,是新手比较容易掌握的语言,就个人而言,选择的也是基于Python语言的Unittest和Pytest框架交替使用。
Unittest框架中有4个重要的概念:test fixture、test case、test suite、 test runner。
Testcase:一个TestCase的实例就是一个测试用例。什么是测试用例呢?就是一个完整的测试流程,包括测试前准备环境的搭建(setUp),执行测试代码 (run),以及测试后环境的还原(tearDown)。元测试(unit test)的本质也就在这里,一个测试用例是一个完整的测试单元,通 过运行这个测试单元,可以对某一个问题进行验证。
Test suite:多个测试用例集合在一起,就是TestSuite,而且TestSuite也可以嵌套TestSuite。
Test runner:是来执行测试用例的,其中的run(test)会执行TestSuite/TestCase中的run(result)方法,入参为suite测试套件。
TestLoader:是用来加载TestCase到TestSuite中的,其中有几个loadTestsFrom__()方法,就是从各个地方寻找TestCase,创建它们的实例,然后add到TestSuite中,再返回一个TestSuite实例。
Test fixture:对一个测试用例环境的搭建和销毁,是一个fixture,通过覆盖 TestCase的setUp()和tearDown()方法来实现。这个有什么用呢?比如说在这个测试用例中需要访问数据库,那么可以在setUp() 中建立数据库连接以及进行一些初始化,在tearDown()中清除在数据库中产生的数据,然后关闭连接。注意tearDown的过程很重要,要为以后的 TestCase留下一个干净的环境。关于fixture,还有一个专门的库函数叫做fixtures,功能更加强大。
其他的还有:
Test main():使用她可以方便的将一个单元测试模块变为可直接运行的测试脚本,main()方法使用TestLoader类来搜索所有包含在该模块中以“test”命名开头的测试方法,并自动执行他们。执行方法的默认顺序是:根据ASCII码的顺序加载测试用例,数字与字母的顺序为:0-9,A-Z,a-z。所以以A开头的测试用例方法会优先执行,以a开头会后执行。
Test defaultTestLoader:defaultTestLoader()类,通过该类下面的discover()方法可自动更具测试目录start_dir匹配查找测试用例文件(test*.py),并将查找到的测试用例组装到测试套件,因此可以直接通过run()方法执行discover。用法如下:
discover=unittest.defaultTestLoader.discover(test_dir, pattern='test_*.py')
Test skip:unittest.skip()装饰器,当运行用例时,有些用例可能不想执行等,可用装饰器暂时屏蔽该条测试用例。一种常见的用法就是比如说想调试某一个测试用例,想先屏蔽其他用例就可以用装饰器屏蔽。
@unittest.skip(reason): skip(reason)装饰器:无条件跳过装饰的测试,并说明跳过测试的原因。
@unittest.skipIf(reason): skipIf(condition,reason)装饰器:条件为真时,跳过装饰的测试,并说明跳过测试的原因。
@unittest.skipUnless(reason): skipUnless(condition,reason)装饰器:条件为假时,跳过装饰的测试,并说明跳过测试的原因。
@unittest.expectedFailure(): expectedFailure()测试标记为失败。
然后通过查看unittest的源码,来看一下这几个概念,以及他们之间的关系,他们是如何在一起工作的,其静态类图如下:
整个流程是很清晰的,首先是要写好TestCase,然后由TestLoader加载TestCase到TestSuite,然后由TextTestRunner来运行TestSuite,运行的结果保存在TextTestResult中,整个过程集成在unittest.main模块中。
测试的基础就是TestCase,也就是用例的编写,用例的开始需要对测试做前期准备,用例结束则需清理环境,保证下一个用例在合适的环境下进行。
unittest注意点:
- 导入unittest模块
- 类名的第一个字母大写;
- 类要继承unittest.TestCase;
- 测试函数前必须加test,否则不会被当作测试用例来执行;
- setUp()和tearDown()方法每个测试用例都会执行