一、Unittest单元测试框架简介

Unitest是Python下的一个单元测试模块,是Python标准库模块之一,安装完Python后就可以直接import该模块,能在单元测试下编写具体的测试用例脚本,并调用模块封装好的方法,实现测试用例的执行、测试场景的恢复,甚至能批量采集测试用例脚本、批量运行测试脚本用例、控制执行顺序等,依托于Unittest模块,可以高效的组织测试用例编写、测试用例脚本的采集管理以及脚本运行的执行控制等。Unitest单元测试框架主要包含如下几个重要的逻辑单元:

1.测试固件(test fixture)
      一个测试固件包括两部分,执行测试代码的前置条件和测试结束之后的场景恢复,这两部分一般用函数setUp()和tearDown()表示。简单说,就是平时手工测试一条具体的测试用例时,测试的前置环境和测试结束后的环境恢复。
2.测试用例(test case)
       unittest中管理的最小单元是测试用例,就是一个测试用例,包括具体测试业务的函数或者方法,只是该test case 必须是以test开头的函数。unittest会自动化识别test开头的函数是测试代码,如果你写的函数不是test开头,unittest是不会执行这个函数里面的脚本,这个千万要记住,所有的测试函数都要test开头,记住是小写的哦。
3.测试套件 (test suite)
       就是很多测试用例的集合,一个测试套件可以随意管理多个测试用例,该部分用来实现诸多测试用例的采集,形成一套测试用例集。
4.测试执行器 (test runner)
       test runner是一个用来执行加载测试用例,并执行用例,且提供测试输出的一个逻辑单元。test runner可以加载test case或者test suite进行执行测试任务,并能控制用例集的执行顺序等。

从Unitest单元测试框架的基本逻辑单元设计来看,很明显可以看到它包含了用例的整个生命周期:用例的前置条件、用例的编写、用例的采集、用例的执行以及测试执行后的场景恢复。

、首次使用Unittest模块

下面以打开百度,进行搜索,创建一个名为baidu_search.py的脚本文件,编写百度搜索分别python2和python3的测试用例,代码如下:

  1. '''
  2. Code description:
  3. Create time:
  4. Developer:
  5. '''
  6. # -*- coding: utf-8 -*-
  7. import time
  8. import unittest
  9. from selenium import webdriver
  10. class Search(unittest.TestCase):
  11. def setUp(self):
  12. """
  13. 测试前置条件,这里要搜索的话就是先得打开百度网站啦
  14. """
  15. self.driver = webdriver.Ie()
  16. self.driver.maximize_window()
  17. self.driver.implicitly_wait(5)
  18. self.driver.get("https://www.baidu.com")
  19. def tearDown():
  20. """
  21. 测试结束后环境复原,这里就是浏览器关闭退出
  22. """
  23. self.driver.quit()
  24. def test_search1(self):
  25. """
  26. 这里一定要test开头,把测试逻辑代码封装到一个test开头的方法里。
  27. """
  28. self.driver.find_element_by_id('kw').send_keys('python2')
  29. self.driver.find_element_by_id('su').click()
  30. time.sleep(1)
  31. try:
  32. assert 'python2' in self.driver.title
  33. print('检索python2完成')
  34. except Exception as e:
  35. print('检索失败', format(e))
  36. def test_search2(self):
  37. """
  38. 这里一定要test开头,把测试逻辑代码封装到一个test开头的方法里。
  39. """
  40. self.driver.find_element_by_id('kw').send_keys('python3')
  41. self.driver.find_element_by_id('su').click()
  42. time.sleep(1)
  43. try:
  44. assert 'python3' in self.driver.title
  45. print('检索python3完成')
  46. except Exception as e:
  47. print('检索失败', format(e))
  48. if __name__ == '__main__':
  49. unittest.main()

在PyCharm中运行上面代码,我们会发现浏览器打开关闭了两次,分别检索了python2关闭浏览器,然后检索python3关闭浏览器。

这个效果显然不是我们希望的,我们希望检索完python2后,不用关闭浏览器继续检索python3,Unittest有相关的设置吗?答案是肯定的,我们对以上代码做下调整修改,注意对比不同的地方,然后运行就达到我们想要的效果

  1. '''
  2. Code description:
  3. Create time:
  4. Developer:
  5. '''
  6. # -*- coding: utf-8 -*-
  7. import time
  8. import unittest
  9. from selenium import webdriver
  10. class Search(unittest.TestCase):
  11. @classmethod
  12. def setUpClass(cls):
  13. """
  14. 测试前置条件,这里要搜索的话就是先得打开百度网站啦
  15. """
  16. cls.driver = webdriver.Ie()
  17. cls.driver.maximize_window()
  18. cls.driver.implicitly_wait(5)
  19. cls.driver.get("https://www.baidu.com")
  20. @classmethod
  21. def tearDownClass(cls):
  22. """
  23. 测试结束后环境复原,这里就是浏览器关闭退出
  24. """
  25. cls.driver.quit()
  26. def test_search1(self):
  27. """
  28. 这里一定要test开头,把测试逻辑代码封装到一个test开头的方法里。
  29. """
  30. self.driver.find_element_by_id('kw').send_keys('python2')
  31. self.driver.find_element_by_id('su').click()
  32. time.sleep(1)
  33. try:
  34. assert 'python2' in self.driver.title
  35. print('检索python2完成')
  36. except Exception as e:
  37. print('检索失败', format(e))
  38. def test_search2(self):
  39. """
  40. 这里一定要test开头,把测试逻辑代码封装到一个test开头的方法里。
  41. """
  42. self.driver.find_element_by_id('kw').clear() # 清空之前输入的python2
  43. self.driver.find_element_by_id('kw').send_keys('python3')
  44. self.driver.find_element_by_id('su').click()
  45. time.sleep(1)
  46. try:
  47. assert 'python3' in self.driver.title
  48. print('检索python3完成')
  49. except Exception as e:
  50. print('检索失败', format(e))
  51. if __name__ == '__main__':
  52. unittest.main()

、Unittest模块批量加载和管理用例

      以上对于Unittest框架,我们好像只用到了测试固件、测试用例两个逻辑单元的使用,接下来问题又来了:我们日常项目中的测试案例肯定不止一个,当案例越来越多时我们如何管理这些批量案例?如何保证案例不重复?如果案例非常多(成百上千,甚至更多)时如何保证案例执行的效率?

来看一下在unittest框架中如何管理批量用例:

手动添加采集指定的测试用例集用法:先在PyCharm中新建如下项目层级:

其中baidu_search1还是上面调整修改过的代码,然后编辑run_case.py文件,代码如下:

  1. '''
  2. Code description: 执行add 的测试用例集
  3. Create time:
  4. Developer:
  5. '''
  6. # -*- coding: utf-8 -*-
  7. from testcase.sreach.baidu_sreach1 import Search # 将baidu_sreach.py模块导入进来
  8. import unittest
  9.  
  10. suite = unittest.TestSuite() # 构造测试用例集
  11. # suite.addTest(Search("test_search1"))
  12. suite.addTest(Search("test_search2")) # 分别添加baidu_sreach1.py中的两个检索的测试用例
  13.  
  14. if __name__ == '__main__':
  15. runner = unittest.TextTestRunner() # 实例化runner
  16. runner.run(suite) #执行测试

 这样运行run_case.py,就只执行了在百度中搜索python3这条用例,手动添加指定用例到测试套件的方法是addTest(),但是很多时候我们写了很多测试脚本文件,每个脚本中有多个test,,如果还是使用addTest()方法就不行了,我们希望能获取所有的测试集,并全部执行。然后编辑run_all_case.py文件,编写如下代码:

  1. '''
  2. Code description: TestLoader所有测试case
  3. Create time:
  4. Developer:
  5. '''
  6. # -*- coding: utf-8 -*-
  7. import time
  8. import os.path
  9. import unittest
  10. from selenium import webdriver
  11. class Search(unittest.TestCase):
  12. @classmethod
  13. def setUpClass(cls):
  14. """
  15. 测试前置条件,这里要搜索的话就是先得打开百度网站啦
  16. """
  17. cls.driver = webdriver.Ie()
  18. cls.driver.maximize_window()
  19. cls.driver.implicitly_wait(5)
  20. cls.driver.get("https://www.baidu.com")
  21. @classmethod
  22. def tearDownClass(cls):
  23. """
  24. 测试结束后环境复原,这里就是浏览器关闭退出
  25. """
  26. cls.driver.quit()
  27. def test_search1(self):
  28. """
  29. 这里一定要test开头,把测试逻辑代码封装到一个test开头的方法里。
  30. """
  31. self.driver.find_element_by_id('kw').send_keys('python2')
  32. self.driver.find_element_by_id('su').click()
  33. time.sleep(1)
  34. try:
  35. assert 'python2' in self.driver.title
  36. print('检索python2完成')
  37. except Exception as e:
  38. print('检索失败', format(e))
  39. def test_search2(self):
  40. """
  41. 这里一定要test开头,把测试逻辑代码封装到一个test开头的方法里。
  42. """
  43. self.driver.find_element_by_id('kw').clear() # 清空之前输入的python2
  44. self.driver.find_element_by_id('kw').send_keys('python3')
  45. self.driver.find_element_by_id('su').click()
  46. time.sleep(1)
  47. try:
  48. assert 'python3' in self.driver.title
  49. print('检索python3完成')
  50. except Exception as e:
  51. print('检索失败', format(e))
  52. def test_search3(self):
  53. """
  54. 这里一定要test开头,把测试逻辑代码封装到一个test开头的方法里。
  55. """
  56. self.driver.find_element_by_id('kw').clear() # 清空之前输入的python3
  57. self.driver.find_element_by_id('kw').send_keys('hello world')
  58. self.driver.find_element_by_id('su').click()
  59. time.sleep(1)
  60. try:
  61. assert 'hello world' in self.driver.title
  62. print('检索hello world完成')
  63. except Exception as e:
  64. print('检索失败', format(e))
  65.  
  66. case_path = os.path.join(os.getcwd()) # 在当前目录中采集测试用例
  67. print(case_path)
  68. all_case = unittest.defaultTestLoader.discover(case_path, pattern="test*.py", top_level_dir=None) # 采集所有test开头的测试用例
  69. print(all_case)
  70.  
  71. if __name__ == '__main__':
  72.  
  73. runner = unittest.TextTestRunner() # 实例化runner
  74. runner.run(all_case) # 执行测试

获取所有的测试用例集使用的是discover()方法,在PyCharm中运行该脚本就如下:

以上就完成了在Python Unittest单元测试框架下编写测试用例脚本,并使用其提供的多种方法来批量管理测试用例集并并执行。

Python3+Selenium2完整的自动化测试实现之旅(六):Python单元测试模块Unittest运用的更多相关文章

  1. Python3+Selenium2完整的自动化测试实现之旅(七):完整的轻量级自动化框架实现

    一.前言 前面系列Python3+Selenium2自动化系列博文,陆陆续续总结了自动化环境最基础环境的搭建.IE和Chrome浏览器驱动配置.selenium下的webdriver模块提供的元素定位 ...

  2. Python3+Selenium2完整的自动化测试实现之旅(五):自动化测试框架、Python面向对象以及POM设计模型简介

    前言 之前的系列博客,陆续学习整理了自动化测试环境的搭建.IE和Chrome浏览器驱动的配置.selenium-webdriver模块封装的元素定位以及控制浏览器.处理警示框.鼠标键盘等方法的使用,这 ...

  3. Python3+Selenium2完整的自动化测试实现之旅(一):自动化测试环境搭建

    1     环境搭建准备 (1)    下载Python3版本的安装包,直接官网下载即可:Python官网:https://www.python.org/ (2)    下载Python的基础工具包p ...

  4. Python3+Selenium2完整的自动化测试实现之旅(四):Selenium-webdriver操作浏览器、Cookie、鼠标键盘、警示框、设置等待时间、多窗口切换

    本篇学习总结webdriver模块操作浏览器.Cookie.鼠标键盘.警示框.设置等待时间.多窗口切换等方法的使用 1    浏览器控制 Selenium-webdriverAPI提供了对页面元素定位 ...

  5. Python3+Selenium2完整的自动化测试实现之旅(三):Selenium-webdriver提供的元素定位方法

    本篇以实例介绍selenium下的webdriver模块提供的定位页面元素(也可以称为对象)的方法和使用技巧,在此注意:在做WEB自动化测试前,需要对前端相关的技术有所了解,如HTML.XML.Xpa ...

  6. Python3+Selenium2完整的自动化测试实现之旅(二):IE和Chrome浏览器驱动配置

    上一篇写了自动化测试需要的最基础环境配置,地址:https://www.cnblogs.com/tdp0108/p/10412073.html 当前市面上很多公司开发的应用软件都是BS架构,即基于浏览 ...

  7. Python3 Selenium自动化web测试 ==> 第一节 起始点之Python单元测试框架 unittest

    前置步骤 Python版本:3.6.4 selenium版本:3.11.0 >>> import selenium >>> help(selenium) IDE:P ...

  8. 【python之旅】python的模块

    一.定义模块: 模块:用来从逻辑上组织python代码(变量.函数.类.逻辑:实现一个功能),本质就是以.py结尾的python文件(文件名:test.py ,对应的模块名就是test) 包:用来从逻 ...

  9. selenium2 Webdriver + Java 自动化测试实战和完全教程

    selenium2 Webdriver + Java 自动化测试实战和完全教程一.快速开始 博客分类: Selenium-webdriverselenium webdriver 学习selenium ...

随机推荐

  1. SSM框架mapper.xml模糊查询语句

    SSM框架mapper.xml模糊查询语句 在用SSM框架时,如果想要实现模糊查询,可以在mapper.xml文件中进行数据库语句的书写,方法有很多种,在这里我选择了两种介绍: 方法1: <se ...

  2. 面试题:int和Integer的区别

    java底层源码:  -128  127之间

  3. [bzoj1059]矩阵游戏

    虽然是一道水难题,但是我这种蒟蒻还是要讲一讲的. Description 小Q是一个非常聪明的孩子,除了国际象棋,他还很喜欢玩一个电脑益智游戏——矩阵游戏.矩阵游戏在一个N *N黑白方阵进行(如同国际 ...

  4. 【原创】XAF常用属性字段设置

    1.IP地址IPV4 [XafDisplayName()] [ModelDefault("EditMaskType", "RegEx")] [ModelDefa ...

  5. 正则表达示 for Python3

    前情提要 从大量的文字内容中找到自己想要的东西,正则似乎是最好的方法.也是写爬虫不可缺少的技能.所以,别墨迹了赶紧好好学吧! 教程来自http://www.runoob.com/python3/pyt ...

  6. thinkphp mysql查询结果为什么全是string问题

    找到根目录下的thinkphp\library\think\db\Connection.php 文件 // PDO连接参数 protected $params = [ PDO::ATTR_CASE = ...

  7. return和throw某些特性相似

    拷贝构造函数的调用拷贝构造函数会在以下三中情况下被调用(1)当类的一个对象去初始化该类的另一个对象时 int main(){ Point a(1,2); Point b(a);//用对象a初始化对象b ...

  8. hadoop基础操作

    通过hadoop上的hive完成WordCount 启动hadoop Hdfs上创建文件夹 上传文件至hdfs 启动Hive 创建原始文档表 导入文件内容到表docs并查看 用HQL进行词频统计,结果 ...

  9. 基于 TensorFlow 在手机端实现文档检测

    作者:冯牮 前言 本文不是神经网络或机器学习的入门教学,而是通过一个真实的产品案例,展示了在手机客户端上运行一个神经网络的关键技术点 在卷积神经网络适用的领域里,已经出现了一些很经典的图像分类网络,比 ...

  10. 动态规划----最长公共子序列(LCS)问题

    题目: 求解两个字符串的最长公共子序列.如 AB34C 和 A1BC2   则最长公共子序列为 ABC. 思路分析:可以用dfs深搜,这里使用到了前面没有见到过的双重循环递归.也可以使用动态规划,在建 ...