自动化总结(二) 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注意点:

  1. 导入unittest模块
  2. 类名的第一个字母大写;
  3. 类要继承unittest.TestCase;
  4. 测试函数前必须加test,否则不会被当作测试用例来执行;
  5. setUp()和tearDown()方法每个测试用例都会执行

  

原文地址:https://www.cnblogs.com/keima/p/14823318.html