单元测试Unittest

单元测试简介

单元测试(unit testing),是指对软件中的最小可测试单元进行检查和验证。对于单元测试中单元的含义,一般来说,要根据实际情况去判定其具体含义,如C语言中单元指一个函数,Java里单元指一个类,图形化的软件中可以指一个窗口或一个菜单等。总的来说,单元就是人为规定的最小的被测功能模块。单元测试是在软件开发过程中要进行的最低级别的测试活动,软件的独立单元将在与程序的其他部分相隔离的情况下进行测试。在一种传统的结构化编程语言中,比如C,要进行测试的单元一般是函数或子过程。在像C++这样的面向对象的语言中, 要进行测试的基本单元是类。对Ada语言来说,开发人员可以选择是在独立的过程和函数,还是在Ada包的级别上进行单元测试。单元测试的原则同样被扩展到第四代语言(4GL)的开发中,在这里基本单元被典型地划分为一个菜单或显示界面。经常与单元测试联系起来的另外一些开发活动包括代码走读(Code review),静态分析(Static analysis)和动态分析(Dynamic analysis)。静态分析就是对软件的源代码进行研读,查找错误或收集一些度量数据,并不需要对代码进行编译和执行。动态分析就是通过观察软件运行时的动作,来提供执行跟踪,时间分析,以及测试覆盖度方面的信息。

Unittest 重要组成

Python中有一个自带的单元测试框架是unittest模块,用它来做单元测试,它里面封装好了一些校验返回的结果方法(断言)和一些用例执行前的初始化操作。

unittest中最核心的部分是:TestFixture、TestCase、TestSuite、TestRunner

TestFixture:用于一个测试环境的准备和销毁还原。
当测试用例每次执行之前需要准备测试环境,每次测试完成后还原测试环境,比如执行前连接数据库、打开浏览器等,执行完成后需要还原数据库、关闭浏览器等操作。这时候就可以启用testfixture。

setUp():准备环境,执行每个测试用例的前置条件;

tearDown():环境还原,执行每个测试用例的后置条件;

setUpClass():必须使用@classmethod装饰器,所有case执行的前置条件,只运行一次;

tearDownClass():必须使用@classmethod装饰器,所有case运行完后只运行一次;

TestCase:测试用例

先写一个简单地加减数据

class CalcClass():
    def jia(self,a,b):
        c = a + b
        return c
    def jian(self,a,b):
        c = a - b
        return c
if __name__ == "__main__":
    d = CalcClass()
    f = d.jia(2,7)
    print(f)
    r = d.jian(8,6)
    print(r)

在这里插入图片描述

导入包

from func_kaifa.funcText import CalcClass

使用单元测试 先导入unittest的包

import unittest

继承unittest.TestCase类才能使用里面的方法

setUp(self)

class Test(unittest.TestCase):
    #  对应的是  测试用例执行之前的操作
    def setUp(self) -> None:
        #  会在测试用例执行之前打印start
        print("start")
    # 执行一个测试用例
    # 必须以test开头,不然找不到
    def test1(self):
        c = CalcClass()
        f = c.jia(1,2)
        return f
    def tearDown(self) -> None:
        print("end")
if __name__ == "__main__":
    # 找到所有的用例
    unittest.main()

断言

判断所输入的值是否与与预期结果相同

self.assertEqual(f,3)

测试套件

导入包

from func_kaifa.funcText import CalcClass

使用单元测试 先导入unittest的包

import unittest

继承unittest.TestCase类才能使用里面的方法

setUp(self)

class Test(unittest.TestCase):
    #  对应的是  测试用例执行之前的操作
    def setUp(self) -> None:
        #  会在测试用例执行之前打印start
        print("start")
    # 执行一个测试用例
    # 必须以test开头,不然找不到
    def test1(self):
        c = CalcClass()
        f = c.jia(1,2)
        # 判断所输入的值是否与与预期结果相同
        self.assertEqual(f,3)
        return f
    def test2(self):
        c1 = CalcClass()
        f1 = c1.jian(3, 2)
        # 判断所输入的值是否与与预期结果相同
        self.assertEqual(f1, 1)
        return f1
    def tearDown(self) -> None:
        print("end")

if __name__ == "__main__":
    su = unittest.TestSuite()  # 创建测试套件
    list_cases = ["test1","test2"]    #把测试用例添加到列表中
    for list_case in list_cases:
        su.addTest(Test(list_case))      #循环添加到套件中
    runner = unittest.TextTestRunner(verbosity=1)     #运行套件
    runner.run(su)

套件有三种方法

 方法1:
    suite = unittest.TestSuite()  # 创建测试套件
    suite.addTest(Test("test2"))
    suite.addTest(Test("test2"))
    runner = unittest.TextTestRunner(verbosity=2)
    runner.run(suite)
    
    方法2:
    suite = unittest.TestSuite()  # 创建测试套件
    loader = unittest.TestLoader()  # 创建一个加载对象
    suite .addTest(loader.loadTestsFromTestCase(Test))
    runner = unittest.TextTestRunner(verbosity=2)  # 运行套件
    runner.run(suite)
    
    方法3:
    su = unittest.TestSuite()  # 创建测试套件
    list_cases = ["test1","test2"]    #把测试用例添加到列表中
    for list_case in list_cases:
        su.addTest(Test(list_case))      #循环添加到套件中
    runner = unittest.TextTestRunner(verbosity=2)     #运行套件
    runner.run(su)

生成测试报告

相关参数说明:
stream:指定输出的方式
description:报告中要显示的面熟信息
title:测试报告的标题
verbosity :表示测试报告信息的详细程度,一共三个值,默认是1
0 (静默模式):你只能获得总的测试用例数和总的结果,如:总共100个 失败10 成功90
1 (默认模式):类似静默模式,只是在每个成功的用例前面有个. 每个失败的用例前面有个F
2 (详细模式):测试结果会显示每个测试用例的所有相关的信息

HTMLTestRunner.py 如果没有的话从百度搜索下载

#生成测试包报告
    def show(self):
        su = unittest.TestSuite()  # 创建测试套件
        list_cases = ["test1", "test2"]  # 把测试用例添加到列表中
        for list_case in list_cases:
            su.addTest(Test(list_case))  # 循环添加到套件中
        # runner = unittest.TextTestRunner(verbosity=1)             # 运行套件
        # runner.run(su)
        with open("../truth.html", 'wb') as f:
            HTMLTestRunner(
                stream=f,
                verbosity=2,
                title="加法运算",
                description="加法的运算结果展示"
            ).run(su)

if __name__ == "__main__":
    # 调用方法
    showall = Test()
    showall.show()

生成的HTML文件

在这里插入图片描述

读取XML文件数据 创建xml文件

#方法1
from xml.dom import minidom
class ReadXml():
    def read_xml(self,filename,onename,twoname):
        # 填写你所创建的xml文件路径
        root = minidom.parse(filename)
        #  传递标签
        firstnode = root.getElementsByTagName(onename)[0]
        # 传递标签获取内的数据
        secondnode = firstnode.getElementsByTagName(twoname)[0].firstChild.data
        return secondnode
r = ReadXml()
a = r.read_xml("../CommDemo/testxml","demo_one","add_one")
b = r.read_xml("../CommDemo/testxml","demo_one","add_two")
c = r.read_xml("../CommDemo/testxml","demo_one","result_one")
print(a,b,c)

# 方法2
from xml.dom import minidom
class ReadXml():
    def read_xml(self):
        # 填写你所创建的xml文件路径
        root = minidom.parse("../CommDemo/testxml")
        print(root)
        #  传递标签
        firstnode = root.getElementsByTagName("demo_one")[0]
        print(firstnode)
        # 传递标签获取内的数据
        secondnode = firstnode.getElementsByTagName("add_one")[0].firstChild.data
        # return secondnode
        print(secondnode)
r = ReadXml()
r.read_xml()

读取CSV文件数据

class CalcClass():
    def jia(self,a,b):
        c = a + b
        return c
    def jian(self,a,b):
        c = a - b
        return c
if __name__ == "__main__":
    d = CalcClass()
    f = d.jia(2,7)
    print(f)
    r = d.jian(8,6)
    print(r)
import csv
class ReadCsv():
    def read_csv(self):
        item = []  # 定义一个空列表
        c = csv.reader(open("../data_demo/test1.csv", "r"))  # 得到csv文件对象
        for csv_i in c:
            item.append(csv_i)  # 将获取的数据添加到列表中
        return item

r = ReadCsv()
print(r.read_csv())
# 导入包
from func_kaifa.funcText import CalcClass
import unittest

from data_demo.cvs_test import ReadCsv

r = ReadCsv()
r.read_csv()
print(r.read_csv())

class Test(unittest.TestCase):
    def setUp(self) -> None:
        print("start")

    def test1(self):
        for i in r.read_csv():
            c = CalcClass()
            b = c.jia(int(i[0]),int(i[1]))
            self.assertEqual(b,int(i[2]))

    def tearDown(self):
        print("end")

if __name__ == "__main__":
    # 调用方法
    showall = Test()
    showall.test1()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值