zoukankan      html  css  js  c++  java
  • 四. 引入unittest单元测试框架

    1.   安装 SeleniumIDE(firefox

    (1)下载地址:https://addons.mozilla.org/en-US/firefox/addon/selenium-ide/

    (2) 教程:

    (3) 可以直接将脚本到unittest

    2.  unittest单元测试框架:

      2.1 定义

    1)  单元测试负责对最小的软件设计单元(模块)进行验证,它使用软件设计文档中对模块的描述作为指南,对重要的程序分支进行测试以发现模块中的错误。

    2) unittest 框架(又名 PyUnit 框架)为 python 语言的单元测试框架,从 Python 2.1 及其以后的版本都将 PyUnit 作为一个标准模块放入 python 开发包中。

      2.2 unittest模块的各个属性说明

      1. unittest的属性很多,其中:

    • unittest.TestCase:TestCase类,所有测试用例类继承的基本类
    def class1(unittest.Testcase):
    • unittest.main():使用它可以方便的将一个单元测试模块变为可直接运行的测试脚本,main()方法使用TestLoader类来搜索所有包含在该模块中以“test”命名开头的测试方法,并自动执行他们。执行方法的默认顺序是:根据ASCII码的顺序加载测试用例,数字与字母的顺序为:0-9,A-Z,a-z。所以以A开头的测试用例方法会优先执行,以a开头会后执行。
    • unittest.TestSuite():unittest框架的TestSuite()类是用来创建测试套件的。
    • unittest.TextTextRunner():unittest框架的TextTextRunner()类,通过该类下面的run()方法来运行suite所组装的测试用例,入参为suite测试套件。
    • unittest.defaultTestLoader(): defaultTestLoader()类,通过该类下面的discover()方法可自动更具测试目录start_dir匹配查找测试用例文件(test*.py),并将查找到的测试用例组装到测试套件,因此可以直接通过run()方法执行discover。用法如下:
    discover=unittest.defaultTestLoader.discover(test_dir, pattern='test_*.py')
    • unittest.skip():装饰器,当运行用例时,有些用例可能不想执行等,可用装饰器暂时屏蔽该条测试用例。一种常见的用法就是比如说想调试某一个测试用例,想先屏蔽其他用例就可以用装饰器屏蔽。

      @unittest.skip(reason): skip(reason)装饰器:无条件跳过装饰的测试,并说明跳过测试的原因。

      @unittest.skipIf(reason): skipIf(condition,reason)装饰器:条件为真时,跳过装饰的测试,并说明跳过测试的原因。

      @unittest.skipUnless(reason): skipUnless(condition,reason)装饰器:条件为假时,跳过装饰的测试,并说明跳过测试的原因。

      @unittest.expectedFailure(): expectedFailure()测试标记为失败。

    2.TestCase类的属性中:

    • setUp():setUp()方法用于测试用例执行前的初始化工作。如测试用例中需要访问数据库,可以在setUp中建立数据库连接并进行初始化。如测试用例需要登录web,可以先实例化浏览器。
    • tearDown():tearDown()方法用于测试用例执行之后的善后工作。如关闭数据库连接。关闭浏览器。
    • assert*():一些断言方法:在执行测试用例的过程中,最终用例是否执行通过,是通过判断测试得到的实际结果和预期结果是否相等决定的。

    assertEqual(a,b,[msg='测试失败时打印的信息']):断言a和b是否相等,相等则测试用例通过。

    assertNotEqual(a,b,[msg='测试失败时打印的信息']):断言a和b是否相等,不相等则测试用例通过。

    assertTrue(x,[msg='测试失败时打印的信息']):断言x是否True,是True则测试用例通过。

    assertFalse(x,[msg='测试失败时打印的信息']):断言x是否False,是False则测试用例通过。

    assertIs(a,b,[msg='测试失败时打印的信息']):断言a是否是b,是则测试用例通过。

    assertNotIs(a,b,[msg='测试失败时打印的信息']):断言a是否是b,不是则测试用例通过。

    assertIsNone(x,[msg='测试失败时打印的信息']):断言x是否None,是None则测试用例通过。

    assertIsNotNone(x,[msg='测试失败时打印的信息']):断言x是否None,不是None则测试用例通过。

    assertIn(a,b,[msg='测试失败时打印的信息']):断言a是否在b中,在b中则测试用例通过。

    assertNotIn(a,b,[msg='测试失败时打印的信息']):断言a是否在b中,不在b中则测试用例通过。

    assertIsInstance(a,b,[msg='测试失败时打印的信息']):断言a是是b的一个实例,是则测试用例通过。

    assertNotIsInstance(a,b,[msg='测试失败时打印的信息']):断言a是是b的一个实例,不是则测试用例通过。

      3.TestSuite类的属性中:(组织用例时需要用到)

    • addTest(): addTest()方法是将测试用例添加到测试套件中,如下方,是将test_baidu模块下的BaiduTest类下的test_baidu测试用例添加到测试套件。
    suite = unittest.TestSuite()
    suite.addTest(test_baidu.BaiduTest('test_baidu')) 

      4.TextTextRunner的属性中:(组织用例时需要用到)

    • run(): run()方法是运行测试套件的测试用例,入参为suite测试套件。
    runner = unittest.TextTestRunner()
    runner.run(suite)

     

     

    3.  生成HTMLTextRunner报告

    1)  下载地址

    http://tungwaiyip.info/software/HTMLTestRunner.html 

    2)  保存地址

    C:UserslesleysbwAppDataLocalProgramsPythonPython35Lib

    3)  这是针对python2.7,针对python30需要修改

    • 问题一:No module named StringIO,解决方法:
      • 第94行,将import StringIO修改成import io 
      • 第539行,将self.outputBuffer = StringIO.StringIO()修改成self.outputBuffer= io.StringIO() 
    • 问题二:AttributeError: 'dict' object has no attribute 'has_key',解决方法:
      • 第642行,将if not rmap.has_key(cls):修改成if not cls in rmap: 
    • 问题三:'str' object has no attribute 'decode',解决方法:python3 里面对字符的操作中,decode已经拿掉了。
      • 第766行,将uo = o.decode(‘latin-1‘)修改成uo = e 
      • 第775行,将ue = e.decode(‘latin-1‘)修改成ue = e 
    • 问题四 :TypeError: can't concat bytes to str
      • 第778行,将output = saxutils.escape(uo+ue),修改成output = saxutils.escape(str(uo)+str(ue)),
    • 问题五:TypeError: unsupported operand type(s) for >>:

    'builtin_function_or_method' and 'RPCProxy',解决方法:python2 和 python3 的print是很不同的,那么在3中,print 后面是不会跟>> 这样的

      • 第631行,将print >> sys.stderr, ‘ Time Elapsed: %s‘ %(self.stopTime-self.startTime)修改成print(sys.stderr, ‘ TimeElapsed: %s‘ % (self.stopTime-self.startTime)) 

    将上述几处改动,保存成功后,再将HTMLTestRunner.py放到C:Python34Lib目录中,检验是否加载成功,在Python IDLE 中输入 import HTMLTestRunner ,若无报错,那么加载成功。

    4)  文件调用语句更改

    python3 里面打开文件使用 open,不要再去用file了。即 fp = file(filename,'wb')替换成 fp = open(filename,'wb');关闭该文件可用fp.close()

    5) HTMLTestRunner.py 的使用备注:

    • 问题: 执行测试用例的过程中,不会打印任何东西
    • 解决思路: 每次执行一个测试用例时,就打印该测试用例的名称。
    • 解决方案: 找到536行的 “def startTest(self, test):” 函数,在函数第一行加入代码“print("Start Test:",str(test))”。
    • 这样每次执行一个测试用例,就可以从console看到该测试用例的名字被打印出来。
    • 其他问题(无法生成HTTPTextRunner报告):

    http://blog.csdn.net/xie_0723/article/details/50825310

    4.  结构:

    • 编写测试用例(eg:baidu.py),放在test_case目录下面
    • 测试用例独立运行后,更名为start_baidu.py,在all_test.py中,引入discover方法

    (1)百度搜索测试用例Test Case:

     1 # coding=utf-8
     2 '''
     3 Created on 2016-7-22
     4 @author: Jennifer
     5 Project:登录百度测试用例
     6 '''
     7 from selenium import webdriver
     8 import unittest, time
     9 
    10 class BaiduTest(unittest.TestCase):
    11     def setUp(self):
    12         self.driver = webdriver.Firefox()
    13         self.driver.implicitly_wait(30) #隐性等待时间为30秒
    14         self.base_url = "https://www.baidu.com"
    15     
    16     def test_baidu(self):
    17         driver = self.driver
    18         driver.get(self.base_url + "/")
    19         driver.find_element_by_id("kw").clear()
    20         driver.find_element_by_id("kw").send_keys("unittest")
    21         driver.find_element_by_id("su").click()
    22         time.sleep(3)
    23         title=driver.title
    24         self.assertEqual(title, u"unittest_百度搜索") 
    25 
    26     def tearDown(self):
    27         self.driver.quit()
    28 
    29 if __name__ == "__main__":
    30     unittest.main()

    (2)有道翻译测试用例Test Case

     1 # coding=utf-8
     2 '''
     3 Created on 2016-7-22
     4 @author: Jennifer
     5 Project:使用有道翻译测试用例
     6 '''
     7 from selenium import webdriver
     8 import unittest, time
     9 
    10 class YoudaoTest(unittest.TestCase):
    11     def setUp(self):
    12         self.driver = webdriver.Firefox()
    13         self.driver.implicitly_wait(30) #隐性等待时间为30秒
    14         self.base_url = "http://www.youdao.com"
    15     
    16     def test_youdao(self):
    17         driver = self.driver
    18         driver.get(self.base_url + "/")
    19         driver.find_element_by_id("translateContent").clear()
    20         driver.find_element_by_id("translateContent").send_keys(u"你好")
    21         driver.find_element_by_id("translateContent").submit()
    22         time.sleep(3)
    23         page_source=driver.page_source
    24         self.assertIn( "hello",page_source) 
    25 
    26     def tearDown(self):
    27         self.driver.quit()
    28 
    29 if __name__ == "__main__":
    30     unittest.main()

    (3)通过discover()执行所有的测试用例,并发送测试报告

     1 # coding = utf-8
     2 import unittest
     3 import HTMLTestRunner
     4 import os, time
     5 
     6 list = "D:\selenium_python\test_case"
     7 def createsuit():
     8     testunit = unittest.TestSuite()
     9 
    10     # discover()方法定义
    11     discover = unittest.defaultTestLoader.discover(
    12         list,
    13         pattern='test_*.py',
    14         top_level_dir=None
    15     )
    16     # 将discover()筛选出来的用例,循环添加到测试套件中
    17     for test_suite in discover:
    18         for test_case in test_suite:
    19             testunit.addTest(test_case)
    20             print(testunit)
    21     return testunit
    22 alltestnames = createsuit()
    23 
    24 # 创建测试报告文件
    25 now = time.strftime('%Y-%m-%d_%H_M_S', time.localtime(time.time()))
    26 filename = "D:\selenium_python\report\" + now + 'report.html'
    27 fp = open(filename,'wb')
    28 
    29 runner = HTMLTestRunner.HTMLTestRunner(
    30     stream=fp,
    31     title='测试报告',
    32     description='用例执行情况:'
    33 )
    34 runner.run(alltestnames)
  • 相关阅读:
    git速度慢解决方式
    idea破解
    高并发redis分布式锁
    一个简单的struts2项目
    一个简单的java项目使用hibernate连接mysql数据库
    hibernate连接数据库中文乱码
    删除文件时出现找不到该项目 请确认该项目位置
    redis错误解决
    pyQT4和pyQT5的主要模块介绍
    python之type函数
  • 原文地址:https://www.cnblogs.com/lesleysbw/p/5916002.html
Copyright © 2011-2022 走看看