详解python单元测试框架unittest


Posted in Python onJuly 02, 2018

一:unittest是python自带的一个单元测试框架,类似于java的junit,基本结构是类似的。

基本用法如下:

1.用import unittest导入unittest模块

2.定义一个继承自unittest.TestCase的测试用例类,如

class abcd(unittest.TestCase):

3.定义setUp和tearDown,这两个方法与junit相同,即如果定义了则会在每个测试case执行前先执行setUp方法,执行完毕后执行tearDown方法。

4.定义测试用例,名字以test开头,unittest会自动将test开头的方法放入测试用例集中。

5.一个测试用例应该只测试一个方面,测试目的和测试内容应很明确。主要是调用assertEqual、assertRaises等断言方法判断程序执行结果和预期值是否相符。

6.调用unittest.main()启动测试

7.如果测试未通过,则会显示e,并给出具体的错误(此处为程序问题导致)。如果测试失败则显示为f,测试通过为.,如有多个testcase,则结果依次显示。

一个单testcase的简单的例子:

# -*- coding:UTF-8 -*-
'''
Created on 2015年3月24日

@author: Administrator
'''
import unittest
from selenium import webdriver
import time


class TestCase1(unittest.TestCase):


  def setUp(self):
    self.driver=webdriver.Firefox()
    self.base_url="http://www.baidu.com"


  def tearDown(self):
    self.driver.quit()


  def testCase1(self):
    driver=self.driver
    driver.get(self.base_url)
    print "将窗口最大化"
    driver.maximize_window()
    time.sleep(10)


if __name__ == "__main__":
  unittest.main()

一个多testcase的例子:

# -*- coding:UTF-8 -*-
'''
Created on 
@author: Administrator
'''
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support.ui import Select
from selenium.common.exceptions import NoSuchElementException,\
  NoAlertPresentException
import HTMLTestRunner
#form selenium.common.exceptions import NoAlertPresentException
import unittest, time, re

class Baidu(unittest.TestCase):
  def setUp(self):
    self.driver = webdriver.Firefox()
    self.driver.implicitly_wait(30)
    self.base_url = "http://www.baidu.com/?tn=98012088_4_dg&ch=3"
    self.verificationErrors = []
    self.accept_next_alert = True
    self.driver.get(self.base_url)

  def test_baidu_search(self):
    '''百度搜索'''
    driver = self.driver
#    driver.get(self.base_url + "/")
    try:
      driver.find_element_by_id("kw").send_keys("selenium webdriver")
      driver.find_element_by_id("su").click()
    except:
      driver.get_screenshot_as_file('D:\\workspace\\python_prictise\\src\\error.png')
    time.sleep(2)
    driver.close()

  def test_baidu_set(self):
    '''百度新闻'''
    driver = self.driver
    driver.find_element_by_name("tj_trnews").click()
    self.assertEqual(driver.title,u'百度新闻搜索——全球最大的中文新闻平台',"switch to baidu news faile!")
#    time.sleep(2)

  def is_element_present(self, how, what):
    try: self.driver.find_element(by=how, value=what)
    except NoSuchElementException: return False
    return True

  def is_alert_present(self):
    try: self.driver.switch_to_alert()
    except NoAlertPresentException: return False
    return True

  def close_alert_and_get_its_text(self):
    try:
      alert = self.driver.switch_to_alert()
      alert_text = alert.text
      if self.accept_next_alert:
        alert.accept()
      else:
        alert.dismiss()
      return alert_text
    finally: self.accept_next_alert = True

  def tearDown(self):
    self.driver.quit()
    self.assertEqual([], self.verificationErrors)

if __name__ == "__main__":  
  unittest.main()

二:跳过单个testcase和testclass的方法

在unittest中也支持类似junit中的跳过单个测试case或者测试class的方法,如下:

@unittest.skip(reason)

无条件的跳过被修饰的testcase或者testclass,reason描述为何跳过该测试,为一个字符串;

@unittest.skipIf(condition,reason)

如果条件condition为真,则跳过该testcase或者testclass;

@unittest.skipUnless(condition,reason)

除非条件condition为真,否则跳过被修饰的testcase或者testclass;

@unittest.expectedFailure

标记测试为一个预期失败的测试,但不会作为失败测试统计在结果中;

三:断言

在unittest中用断言来判断是pass还是fail,常见的断言方法如下:

assertEqual(a, b) a == b
assertNotEqual(a, b) a != b
assertTrue(x) bool(x) is True
assertFalse(x) bool(x) is False
assertIs(a, b) a is b
assertIsNot(a, b) a is not b
assertIsNone(x) x is None
assertIsNotNone(x) x is not None
assertIn(a, b) a in b
assertNotIn(a, b) a not in b
assertIsInstance(a, b) isinstance(a, b)
assertNotIsInstance(a, b) not isinstance(a, b)
assertAlmostEqual(a, b) round(a-b, 7) == 0
assertNotAlmostEqual(a, b) round(a-b, 7) != 0
assertGreater(a, b) a > b 2.7
assertGreaterEqual(a, b) a >= b 2.7
assertLess(a, b) a < b 2.7
assertLessEqual(a, b) a <= b 2.7
assertRegexpMatches(s, re) regex.search(s) 2.7
assertNotRegexpMatches(s, re) not regex.search(s) 2.7
assertItemsEqual(a, b) sorted(a) == sorted(b) and works with unhashable objs 2.7
assertDictContainsSubset(a, b) all the key/value pairs in a exist in b 2.7
assertMultiLineEqual(a, b) strings 2.7
assertSequenceEqual(a, b) sequences 2.7
assertListEqual(a, b) lists 2.7
assertTupleEqual(a, b) tuples 2.7
assertSetEqual(a, b) sets or frozensets 2.7
assertDictEqual(a, b) dicts 2.7
assertMultiLineEqual(a, b) strings 2.7
assertSequenceEqual(a, b) sequences 2.7
assertListEqual(a, b) lists 2.7
assertTupleEqual(a, b) tuples 2.7
assertSetEqual(a, b) sets or frozensets 2.7
assertDictEqual(a, b) dicts 2.7

其他断言方法请查阅官方文档

四:组成测试套件

1.添加数量较少的测试case,可以用如下方法:

suite=unittest.Testsuite()
suite.addTest(testclass(testcase))

这里testclass为测试类的名称,testcase为该测试类下的测试case的名称,为字符串。

2.对于有多个测试类的情况,可以用如下方法:

def createsuite():
  testunit=unittest.TestSuite()
  discover=unittest.defaultTestLoader.discover(testdir,pattern='test_*.py', top_level_dir=None)
  print discover
  for test_suite in discover:
    for testsuit in test_suite:
      testunit.addTest(testsuit)
  return testunit
alltestnames = createsuite()

如此便可以将一个目录下多个测试文件中的testcase导入。

Python 相关文章推荐
Python的Django框架中settings文件的部署建议
May 30 Python
jupyter安装小结
Mar 13 Python
python利用正则表达式提取字符串
Dec 08 Python
Python守护进程和脚本单例运行详解
Jan 06 Python
Python实现将HTML转换成doc格式文件的方法示例
Nov 20 Python
padas 生成excel 增加sheet表的实例
Dec 11 Python
Python简单实现区域生长方式
Jan 16 Python
jupyter lab文件导出/下载方式
Apr 22 Python
keras读取h5文件load_weights、load代码操作
Jun 12 Python
Django搭建项目实战与避坑细节详解
Dec 06 Python
对象析构函数__del__在Python中何时使用
Mar 22 Python
基于Python编写简易版的天天跑酷游戏的示例代码
Mar 23 Python
python中多层嵌套列表的拆分方法
Jul 02 #Python
python中int与str互转方法
Jul 02 #Python
用Python将一个列表分割成小列表的实例讲解
Jul 02 #Python
python绘制圆柱体的方法
Jul 02 #Python
Django开发中的日志输出的方法
Jul 02 #Python
Python中循环后使用list.append()数据被覆盖问题的解决
Jul 01 #Python
Django 连接sql server数据库的方法
Jun 30 #Python
You might like
php预定义常量
2006/12/25 PHP
用php过滤危险html代码的函数
2008/07/22 PHP
PHP 防恶意刷新实现代码
2010/05/16 PHP
php结合js实现点击超链接执行删除确认操作
2014/10/31 PHP
php批量添加数据与批量更新数据的实现方法
2014/12/16 PHP
PHP计算指定日期所在周的开始和结束日期的方法
2015/03/24 PHP
php使用PDO下exec()函数查询执行后受影响行数的方法
2017/03/28 PHP
php实现的三个常用加密解密功能函数示例
2017/11/06 PHP
PHP使用PDO、mysqli扩展实现与数据库交互操作详解
2019/07/20 PHP
jquery.form.js实现将form提交转为ajax方式提交的方法
2015/04/07 Javascript
JS+CSS实现仿雅虎另类滑动门切换效果
2015/10/13 Javascript
JS获取字符串实际长度(包含汉字)的简单方法
2016/08/11 Javascript
很棒的js Tab选项卡切换效果
2016/08/30 Javascript
Vue实现一个返回顶部backToTop组件
2017/07/25 Javascript
Vue+jquery实现表格指定列的文字收缩的示例代码
2018/01/09 jQuery
在webstorm开发微信小程序之使用阿里自定义字体图标的方法
2018/11/15 Javascript
JS操作字符串转数字的常见方法示例
2019/10/29 Javascript
详解小程序如何动态绑定点击的执行方法
2019/11/26 Javascript
Python使用random和tertools模块解一些经典概率问题
2015/01/28 Python
Python新手在作用域方面经常容易碰到的问题
2015/04/03 Python
Python常用的文件及文件路径、目录操作方法汇总介绍
2015/05/21 Python
利用Pandas 创建空的DataFrame方法
2018/04/08 Python
Python调用adb命令实现对多台设备同时进行reboot的方法
2018/10/15 Python
win10环境下配置vscode python开发环境的教程详解
2019/10/16 Python
python3使用Pillow、tesseract-ocr与pytesseract模块的图片识别的方法
2020/02/26 Python
Python计算矩阵的和积的实例详解
2020/09/10 Python
CSS3 函数技巧 用css 实现js实现的事情(clac Counters Tooltip)
2017/08/15 HTML / CSS
Html5剪切板功能的实现代码
2018/06/29 HTML / CSS
武汉瑞得软件笔试题
2015/10/27 面试题
智乐游戏测试笔试题
2014/05/21 面试题
思想政治自我鉴定
2013/10/06 职场文书
委托协议书范本
2014/04/22 职场文书
售后服务承诺书模板
2014/05/21 职场文书
2014年国庆节活动总结
2014/08/26 职场文书
实习报告范文
2019/07/30 职场文书
vue实现简单数据双向绑定
2021/04/28 Vue.js