python.UnitTest框架(用例执行、结果断言、HTML报告)

   2023-03-08 学习力0
核心提示:本文将以下方面,阐述UnitTest框架的初级操作:UnitTest介绍:  UnitTest框架的优点  需要注意的地方UnitTest框架使用:  TestCase类中定义的几个特殊方法   执行用例  测试结果  断言  HTML报告  UnitTest介绍:     unittest单元测试

本文将以下方面,阐述UnitTest框架的初级操作:

UnitTest介绍:

UnitTest框架使用:

 

 

UnitTest介绍:

     unittest单元测试框架不仅可以适用于单元测试,还可以适用WEB自动化测试用例的开发与执行,该测试框架可组织执行测试用例,并且提供了丰富的断言方法,判断测试用例是否通过,最终生成测试结果。

  UnitTest框架的优点

  1. 能够组织多个用例去执行
  2. 提供丰富的断言方法
  3. 提供丰富的日志与测试结果

  需要注意的地方

  1. UnitTesrt框架是python自带库不需要下载,使用时import即可
  2. 新建一个测试类是需要继承unittest.TestCase类

 


 

UnitTest框架使用:

  TestCase类中定义的几个特殊方法

  1. setUp():每个测试方法运行前运行,测试前的初始化工作。
  2. tearDown():每个测试方法运行结束后运行,测试后的清理工作。
  3. setUpClass():所有的测试方法运行前运行,单元测试前期准备,必须使用 @classmethod装饰器进行修饰,setUp()函数之前执行,整个测试过程只执行一次。比如:实例化浏览器、浏览器最大化、隐式等待设置
  4. tearDownClass():所有的测试方法运行结束后执行,单元测试后期清理,必须使用 @classmethod装饰器进行修饰,tearDown()之后执行,整个测试过程只执行一次。

  执行用例

   将功能相关的测试用例组合到一起成为一个测试用例集,unittest框架中通过TestSuite类来组装所有的测试用例集。(也就是说,使用测试集合可                  以同时执行同一个py文件中的多个测试用例类)

  1. TestLoader类:测试用例加载器,返回一个测试用例集合
  2. loadTestsFromTestCase类:根据给定的测试类,获取其中的所有以‘test’开头的测试方法,并返回一个测试集合
  3. TestSuite类:组装测试用例的实例,支持添加和删除用例,最后将传递给test runner进行测试执行
  4. TextTestRunner类:测试用例执行类,其中Text 表示以文本形式输出测试结果

     测试结果

  . (点):执行成功,一个点表示一个测试方法

  F:执行失败,如断言失败(输出日志中 failures=1表示一条用例执行失败)

  E:用例本身有异常,如除数为零(输出日志中 errors=1表示一条用例异常)

  skipped:有几条用例被跳过执行

  断言

  

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的一个实例,不是则测试用例通过。

 

  HTML报告

  这个模块不能用pip进行安装,只能下载
  http://tungwaiyip.info/software/HTMLTestRunner.html

  将HTMLTestRunner.py文件复制至Python安装路径下的lib文件夹中 

  执行 import HTMLTestRunner验证

 


 

运用以上所述做个练习:

 

import os
import sys
import time
import unittest
import selenium
import HTMLTestRunner


# 继承unittest.TestCase类
class NumberTest(unittest.TestCase):

    def setUp(self):
        self.a = 10
        self.b = 15

    # Unittest默认运行以test开头的测试用例
    def test_a(self):
        # 使用unittest.TestCase类下面的断言方法对测试结果的判断
        self.assertEqual(self.a+self.b, 10, msg="输入的数字不是10")

    # @unittest.skip('跳过用例b')
    def test_b(self):
        self.assertEqual(self.a-self.b, 20, msg="输入的数字不是20")

    def test_c(self):
        self.assertEqual(self.a*self.b, 30, msg="输入的数字不是30")

    # 在每个测试用例执行完成后都打印"结束"
    def tearDown(self):
        print("结束")


class LoaderTest(unittest.TestCase):

    def test_d(self):
        print("测试LoaderTest")


if __name__ == "__main__":
    # # 执行用例的方法:unittest.main()
    # # 搜索该模块下所有以test开头的测试用例方法,并按照ASCLL码排序执行用例。
    # unittest.main()

    '''
    # 实例化测试套件方法
    suite = unittest.TestSuite()

    # 一次加载多个测试用例并实例化
    testlist = [NumberTest("test_a"), NumberTest("test_b")]
    suite.addTests(testlist)

    # 一次加载一个测试用例并实例化
    # suite.addTest(NumberTest("test_a"))
    # suite.addTest(NumberTest("test_b"))
    
    # 实例化执行测试用例方法
    runner = unittest.TextTestRunner()
    runner.run(suite)
    '''  # 测试套件运行测试类中的测试方法

    '''
    # 加载测试用例并实例化
    testCase = unittest.TestLoader().loadTestsFromTestCase(NumberTest)
    testCase01 = unittest.TestLoader().loadTestsFromTestCase(LoaderTest)
    
    # 组装被加载的测试用例并实例化
    suite = unittest.TestSuite([testCase, testCase01])
    
    # 运行suite
    unittest.TextTestRunner().run(suite)
    '''  # 测试套件运行测试类

    '''
    # 加载测试用例并实例化
    testCase = unittest.TestLoader().loadTestsFromTestCase(NumberTest)
    # 组装被加载的测试用例并实例化
    suite1 = unittest.TestSuite([testCase])
    # 实例化创建时间
    cur_time = time.strftime('%Y-%m-%d_%H_%M_%S')
    # 实例化HTML文件的信息属性
    filename = os.path.dirname(os.path.abspath('.')) + '\\学习笔记\\' + cur_time + '.html'
    # 实例化打开HTML的文件操作
    f = open(filename, "wb")
    # 实例化生成HTML的操作
    runner = HTMLTestRunner.HTMLTestRunner(stream=f, title="测试报告", description='测试报告描述')
    # 执行用例
    runner.run(suite1)
    '''  # HTML报告

 

 
反对 0举报 0 评论 0
 

免责声明:本文仅代表作者个人观点,与乐学笔记(本网)无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
    本网站有部分内容均转载自其它媒体,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责,若因作品内容、知识产权、版权和其他问题,请及时提供相关证明等材料并与我们留言联系,本网站将在规定时间内给予删除等相关处理.

  • HTML中将背景颜色渐变 html设置背景颜色渐变
    通过使用 css3 渐变可以让背景两个或多个指定的颜色之间显示平稳的过渡,由于用到css3所以需要考虑下浏览器兼容问题,例如:从左到右的线性渐变,且带有透明度的样式:#grad {background: -webkit-linear-gradient(left,rgba(255,0,0,0),rgba(255,0,0,1)); /*
    03-08
  • html5 Canvas 如何自适应屏幕大小
    但是这样创建出的画布不能随着浏览器窗口大小的改变而动态的改变画布的大小。而这一点往往又非常重要, 因为我们会经常改变浏览器窗口大小,不会一直保持某个固定的大小。 html代码 canvas width="300" height="300" id="myCanvas"/canvas设置样式 * {
    03-08
  • Vue中出现Do not use built-in or reserved HTML elements as component id:footer等等vue warn问题
    Vue中出现Do not use built-in or reserved HTM
    错误示图:原因:是因为在本地项目对应文件的script中,属性name出现了错误的命名方式,导致浏览器控制台报错!  诸如: name: header 、  、 name: menu , 等等都属于错误的命名方式等 错误代码命名如下:解决办法:办法1: 如果我们采用正确命名
    03-08
  • HTML在网页中插入音频视频简单的滚动效果
    HTML在网页中插入音频视频简单的滚动效果
    每次上网,打开网页后大家都会看到在网页的标签栏会有个属于他们官网的logo,现在学了HTML了,怎么不会制作这个小logo呢,其实很简单,也不需要死记硬背,每当这行代码出现的时候能知道这是什么意思就ok1 link rel="shortcuticon" type="image/x-icon" href="
    03-08
  • HTML的video标签,不能下载视频代码
    !-- 在线视频不能下载代码 --!DOCTYPE html html headscript src="../Demo/demo/book/JQuery/jQuery v2.2.0.js"/script/headbody div style="text-align:center;"video src="../images/PreviewVideo.mp4" width="820"controls="controls&
    03-08
  • ThinkPHP报错 The requested URL /admin/index/login.html was not found on this server.
    ThinkPHP报错 The requested URL /admin/index/
           解决方案在入口文件夹public下查看.htaccess是否存在。不存在则新建,存在的话,那内容替换为下面这串代码 就可以解决Not Fund#IfModule mod_rewrite.c#Options +FollowSymlinks -Multiviews#RewriteEngine On##RewriteCond %{REQUEST_FILENAME
    03-08
  • HTML特殊字符、列表、表格总结 html特殊符号对
            HTML实体字符  在HTML中一些特殊的字符需要用特殊的方式才能显示出来,比如小于号、版权等,  在课堂上老师教了我们一个有点意思的:空格,在教材上字符实体是“nbsp”通过老师  的演示我们发现不同的浏览器他所显示的效果不同,有的比
    03-08
  • 【JavaScript】使用document.write输出覆盖HTML
    您只能在 HTML 输出中使用 document.write。如果您在文档加载后使用该方法,会覆盖整个文档。分析HTML输出流是指当前数据形式是HTML格式的数据,这部分数据正在被导出、传输或显示,所以称为“流”。通俗的来说就是HTML文档的加载过程,如果遇到document.writ
    03-08
  • ASP.Net MVC 控制@Html.DisplayFor日期显示格式
    在做一個舊表的查詢頁時,遇到一個問題:字段在db里存儲的是DATETIME,但保存的值只有日期,沒有時間數據,比如2018/2/26 0:00:00,顯示出來比較難看,當然也可以做一個ViewModel,在字段上添加Attribute定義來更改名稱和顯示名稱,如下:[Display(Name = "建
    03-08
  • html 基础代码
    title淄博汉企/title/headbody bgcolor="#00CC66" topmargin="200" leftmargin="200" bottommargin="200"a name="top"/a今天br /天气nbsp;nbsp;nbsp;nbsp;nbsp;不错br /font color="#CC0000"格式控制标签br /b 文字加粗方式1\bbr /str
    03-08
点击排行