unittest 模块学习笔记(一)

写在开头

本文对unittest进行简单整体的演示 没有太多的细节知识的展现 旨在对整体内容有所感知

本文将解决以下问题:

1.unittest是什么

2.unittest的几个主要功能的关系

3.unittest整个执行的流程

unittest是什么?

·单元测试

        单元测试是软件测试中的一个阶段,其中的单元指的是最小可设计单元,在不同的语言中最小设计单元是不同的,像在c++这种严格面向对象的语言中最小测试单元是类.

·框架

先来看看严谨的定义

框架(Framework)一词最早来源于建筑领域,在软件行业中框架是被定义为整个或部分系统的可重用设计,表现为一组抽象构件及构件实例间交互的方法;另一种定义认为,框架是可被应用开发者定制的应用骨架

下面是我的简单理解

在我的理解中,框架类似流水线的生成机器,只要投入原材料,按照机器设定好的操作就能生成出一类的产品,这一类的产品具有相同的共性,更像是对流程的抽象。(在python类的定义中,有一种变量叫类变量,这种变量是所有类共有的,框架就是将这些类所有共有的变量按某种流程写在一起具有结构的的代码集合.)

·unittest

在软件测试中按照是否手工执行分为自动化测试人工测试,unittest就是通过python运行实现具有单元测试功能的自动测试框架.

·unittest怎么用?


在掌握unittest框架使用前,必须对类的继承和静态方法有一定的了解,由于我自己在学习的时候对python类的继承静态方法和装饰器不太熟悉,于是将其总结到自己的笔记中.


·类的继承

先看一个相对严谨的定义:

类的继承特性允许我们定义一个新类继承一个已有类的所有方法和属性的类。

此处的继承可以简单理解为拥有,和css样式继承类似。

父类是被继承的类,也称为基类

子类是从已有类继承的类,也称为派生类

再看我个人对这个类继承的理解:

将很多具有相同特征的对象按照 某一标准划分为一个集合 这样的集合称为 类具有抽象的特点

继承是类的特性

例如 将所有多细胞真核生命体定义为动物类,这个类具有共同的属性是

1.多细胞

2.真核生命体

当我们要创建一个类描述人时,发现对于动物描述的两个属性 人同样具有

我们开始写过的属性需要重复写一遍 单纯的一两个重复或许不会感到复杂

但是如果很多人 例如张三 李四 我们全部要重写一遍 就会很复杂繁琐

简单总结:当你创建的类是从属于已有类的情况下,类的继承特性会减少代码量.

·静态方法

形式:

@staticmethod

作用:

将某一方法声明为静态方法,声明后不能在其中调用实例对象的方法和属性

需要注意的是:静态方法是可以被类和实例对象调用的

·实例及解释

//引入模块
import unittest

//待测功能函数
def add(a, b):
    return a+b


def divid(s, b):
    return s//b

class CodeTest(unittest.TestCase):
    //建立环境 在此处没有具体环境的搭建 只是简单提提setup函数
    def setUp(self):
        print("开始测试")
    //断言函数看结果是否符合预期输入 复杂的断言后面会提到
    def testAddFunction(self):
        self.assertAlmostEqual(2, add(1, 1))

    def testDivid(self):
        self.assertAlmostEqual(1, divid(2, 1))

    def tearDown(self)
        print("结束测试")


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

这是一个简单的实例

建立一个类 继承unittest.TestCase--->现在这个类具有testcase的全部属性和方法

 搭建一个开始环境 这个开始环境对应的就是测试用例的预置条件 如果用例是打开浏览器就执行测试 这里的代码应该用webdriver打开浏览器

testAddfunction 测试加法函数 此处注意名字必须得用test开头 后面会对其简单解释

teardown 清理环境 这个清理环境对应的就是测试用例结束的环境 如果开始环境是打开浏览器此处就该是退出浏览器 开始和结束环境需要看具体的用例预置条件 需不需重置开始条件

//对应第一个建立环境的函数 setUp
开始测试
结束测试
.开始测试//对应第二个建立环境的函数
结束测试
F

 结果展示:测试结果有三种形式 . F E 

        ". " 表示执行成功且为正确

        "F" 表示执行成功且为错误

        ”E“ 表示未成功执行,出现错误 

FAIL: testDivid (__main__.CodeTest)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "c:\Users\lh\Desktop\学习\python_work\作业\study.py", line 29, in testDivid
    self.assertAlmostEqual(1, divid(2, 1))
AssertionError: 1 != 2 within 7 places (1 difference)

----------------------------------------------------------------------
Ran 2 tests in 0.003s

FAILED (failures=1)

报告展示:

FAIL:错误的地方

AseertionError:错误的原因

ran 用例数 in 时间

FALED 错误的结果

unittest简单原理解释

模块简单解释

unittest 模块中主要的几个部分是:testFixture testSuite testCase Runner

testFixture:提供环境的搭建和拆除(固定环境) 

testCase:测试用例,编写的代码

testSuite:将测试案例封装到suite交给Runner(固定案例)

Runner:运行以及结果展示(运行)

他们之间关系图如下:

 梳理的执行大概流程

 

值得注意的是:

1.开始环境和拆除环境可以在不同的时间点 以模拟不同的测试需求 分别是执行类开始 、执行测试用例开始以及模块开始 (本例是执行用例开始)如果时其他时间开始流程图会有变化

2.环境建立和拆除可以在多个时间点并存 以满足不同测试需求 例如:我可以在模块开始建立一个A环境 类开始建立一个B环境 用例开始前建立C环境 

3.执行顺序并不一定是按照编写顺序 unittest在添加到suite时内部会按照ASCII码进行排序,若要控制顺序,需要在编写方法的时候按照testA*或者test_1_*(*代表任意字符,A-z字母顺序或者1-n数字顺序)的格式命名 或者 用后面的方法二运行.

两种运行方法

if __name__ == "__main__":
    unittest.main()
'''
直接搜索在当前名字的文件里 
继承testcase的类里 以test开头的方法 
找到后发送给loader打包到suite然后执行
'''
if __name__ == "__main__":
    suite = unittest.TestSuite()
    suite.addTest(CodeTest("testAddFunction"))
    runner = unittest.TextTestRunner()
    runner.run(suite)
//等价于第一种 与第一种不同的是可以自定义执行顺序和封装多个测试案例

写在最后:

以上内容和图示仅仅是学习过程中所思所得  不能保证百分百准确无误

如果遇到有误或者不足的地方,烦请不吝赐教

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值