结合实例,联系单元测试。

文件结构:

|----Python_unittest

|--------math_operation.py    # 定义了类【class MathOperation:】,类里面定义了初始化函数,以及加减乘除4个实例方法

|--------two_num_delete.py      # 定义了类【class TestDelete(unittest.TestCase):】,类里面定义了测试减法的用例

|--------two_num_divide.py     # 定义了类【class TestDivide(unittest.TestCase):】,类里面定义了测试除法的用例

|--------unittest_suite.py


 1.two_num_delete.py

import unittes

from Python_unittest.math_operation import MathOperation class TestDelete(unittest.TestCase): @classmethod
def setUpClass(cls):
"""
在执行所有用例之前,会调用setUpClass类属性
:return:
"""
log_file_name = "math_operation_result_log.txt"
cls.one_file = open(log_file_name, mode="a", encoding="utf-8")
print(f"打开【{log_file_name}】文件")
cls.one_file.write("\n{:=^40s}\n".format("开始执行【减法】的测试用例")) @classmethod
def tearDownClass(cls):
"""
在所有用例执行之后, 会调用一次tearDownClass类属性
:return:
"""
cls.one_file.write("{:=^40s}\n".format("【减法】的测试用例执行结束"))
cls.one_file.close() def test_delete0(self):
real_result = MathOperation(9, 6).delete()
expect_value = 3
try:
self.assertEqual(expect_value, real_result, msg="两数相减异常")
print("a>b>0, a-b的结果正常")
self.one_file.write("a>b>0时, a-b测试的结果为:Pass\n")
except AssertionError as err:
print(f"具体异常为:{err}")
self.one_file.write(f"a>b>0时, a-b测试的结果为:Fail\n具体异常为{err}")
raise err  def test_delete1(self):
real_result = MathOperation(-9, -6).delete()
expect_value = -3
try:
self.assertEqual(expect_value, real_result, msg="两数相减异常")
print("a<b<0, a-b的结果正常")
self.one_file.write("a<b<0时, a-b的测试结果为:Pass\n")
except AssertionError as err:
print(f"具体异常为:{err}")
self.one_file.write(f"a<b<0时, a-b的测试结果为:Fail\n具体异常为{err}")
raise err

  


 2.two_num_divide.py

import unittest

from Python_unittest import MathOperation

class TestDivide(unittest.TestCase):

    @classmethod
def setUpClass(cls):
"""
在执行所有用例之前都会执行的文件
:return:
"""
log_file_name = "math_operation_result_log.txt"
cls.one_file = open(log_file_name, mode="a", encoding="utf-8")
print(f"打开【{log_file_name}】文件")
cls.one_file.write("\n{:=^40s}\n".format("开始执行【除法】的测试用例")) @classmethod
def tearDownClass(cls):
"""
在所有用例执行之后, 会调用一次tearDownClass类属性
:return:
"""
cls.one_file.write("{:=^40s}\n".format("【除法】的测试用例执行结束"))
cls.one_file.close() def test_divide0(self):
real_result = MathOperation(9, 3).divide()
expect_result = 3
try:
self.assertEqual(expect_result, real_result, msg="两数相除异常")
print("a>b>0,a/b的结果正常")
self.one_file.write("a>b>0,a/b的测试结果为:Pass\n")
except AssertionError as err:
print(f"具体异常为:{err}")
self.one_file.write(f"a>b>0时, a/b测试的结果为:Fail\n具体异常为{err}")
raise err def test_divide1(self):
real_result = MathOperation(9, -3).divide()
expect_result = 9
try:
self.assertEqual(expect_result, real_result, msg="两数相除异常")
print("a>0>b,a/b的结果正常")
self.one_file.write("a>b>0,a/b的测试结果为:Pass\n")
except AssertionError as err:
print(f"具体异常为:{err}")
self.one_file.write(f"a>b>0时, a/b测试的结果为:Fail\n具体异常为{err}\n")
raise err

  


3.unittest_suite.py

import unittest

from Python_unittest import two_num_divide as num_divide
from Python_unittest import two_num_delete as num_delete # 定义一个【套件】
one_suite = unittest.TestSuite() # 定义【加载器】
# 通过加载器加载用例,并添加到套件中
one_loader = unittest.TestLoader() one_suite.addTest(one_loader.loadTestsFromModule(num_divide))
one_suite.addTest(one_loader.loadTestsFromModule(num_delete))
# 定义【运行器】 one_runner = unittest.TextTestRunner() one_runner.run(one_suite) 

【知识点】

one_suite.addTest(one_loader.loadTestsFromModule(num_divide))  是向套件中一个一个地添加加测试模块的用例

one_suite.addTests(one_loader.loadTestsFromModule(num_divide),one_loader.loadTestsFromModule(num_delete))  可以同时添加多个模块测试用例

执行顺序与添加顺序有关。


4.运行结果:

【知识点】

注意捕获异常时一定要抛出异常,用例的总数是:以test_开头的所有方法的个数,失败数则是根据抛出的【断言异常AssertionError】来统计的。

.代表运行成功,F代表运行失败。

用例执行的顺序:

loadTestsFromModele()方法先添加哪个模块就先执行哪个。

在加载的模块内部,是根据方法的ASCII码的顺序执行测试用例。

defaultTestLoader.discover()默认根据ASCII码的顺序加载测试用例。


5.unittest_discover.py

import unittest

one_suite = unittest.defaultTestLoader.discover(".")
one_runner = unittest.TextTestRunner() one_runner.run(one_suite)

【知识点】

def discover(self, start_dir, pattern='test*.py', top_level_dir=None):

默认加载路径下以“test”开头的模块,所以测试用例的模块应当都是以test开头。

.代表当前py文件所在的路径。

也可以指定绝对路径:one_suite = unittest.defaultTestLoader.discover(r"C:\Users\zfy\PycharmProjects\Python_unittest")


6. 生成的log文件

math_operation_result_log.txt

Python 单元测试 实战演练的更多相关文章

  1. The Hacker's Guide To Python 单元测试

    The Hacker's Guide To Python 单元测试 基本方式 python中提供了非常简单的单元测试方式,利用nose包中的nosetests命令可以实现简单的批量测试. 安装nose ...

  2. [译]PyUnit—Python单元测试框架(1)

    1. 原文及参考资料 原文链接:http://docs.python.org/2/library/unittest.html# 参考文档: http://pyunit.sourceforge.net/ ...

  3. Python单元测试PyUnit框架轻度整改

    原理 参考:单元测试原理 背景 年后有段时间没写代码了,所以趁着周末找了个python单元测试玩下,测试自己的Android应用.发现PyUnit虽然在单个脚本文件中添加多个测试用例,比如官网提供的方 ...

  4. Python单元测试框架

    目录 概况 系统要求 使用PyUnit构建自己的测试 安装 测试用例介绍 创建一个简单测试用例 复用设置代码:创建固件 包含多个测试方法的测试用例类 将测试用例聚合成测试套件 嵌套测试用例 测试代码的 ...

  5. 一种数据与逻辑分离的Python单元测试工具

    一种数据与逻辑分离的Python单元测试工具 几个概念 TestCase TestCase是一个完整的测试单元,最小的测试执行实体,就是我们常说的测试用例. TestSuite 以某种特性将测试用例组 ...

  6. Python单元测试框架之pytest 4 -- 断言

    From: https://www.cnblogs.com/fnng/p/4774676.html Python单元测试框架之pytest -- 断言 2015-08-31 23:57 by 虫师, ...

  7. Python单元测试框架之pytest 3 -- fixtures

    From: https://www.cnblogs.com/fnng/p/4769020.html Python单元测试框架之pytest -- fixtures 2015-08-29 13:05 b ...

  8. Python单元测试框架之pytest 2 -- 生成测试报告

    From: https://www.cnblogs.com/fnng/p/4768239.html Python单元测试框架之pytest -- 生成测试报告 2015-08-29 00:40 by ...

  9. Python单元测试框架unittest使用方法讲解

    这篇文章主要介绍了Python单元测试框架unittest使用方法讲解,本文讲解了unittest概述.命令行接口.测试案例自动搜索.创建测试代码.构建测试套件方法等内容,需要的朋友可以参考下   概 ...

随机推荐

  1. 【LeetCode】553. Optimal Division 解题报告(Python & C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https://leetcode.c ...

  2. 使用.NET 6开发TodoList应用(11)——使用FluentValidation和MediatR实现接口请求验证

    系列导航及源代码 使用.NET 6开发TodoList应用文章索引 需求 在响应请求处理的过程中,我们经常需要对请求参数的合法性进行校验,如果参数不合法,将不继续进行业务逻辑的处理.我们当然可以将每个 ...

  3. HTMl+CSS 模仿京东网登录页面

    课后实践项目,仅页面效果,写博客纯属记录! 码云开源仓库地址:https://gitee.com/ynavc/jd 演示地址:https://ynavc.gitee.io/jd 效果图: 实现代码: ...

  4. 【】JSON语法RFC4627

    Network Working Group D. Crockford Request for Comments: 4627 JSON.org Category: Informational July ...

  5. SpringCloud创建Eureka Client服务注册

    1.说明 本文详细介绍微服务注册到Eureka的方法, 即Eureka Client注册到Eureka Server, 这里用任意一个Spring Cloud服务为例, 比如下面已经创建好的Confi ...

  6. centos7 安装jdk 脚本

    下载安装包 链接:https://pan.baidu.com/s/10-U54WwoEaCC9Afj58owJA 提取码:jdk8 写如脚本 vi ***.sh #!/bin/bash #instal ...

  7. vue3.0+vite+ts项目搭建--初始化项目(一)

    vite 初始化项目 使用npm npm init vite@latest 使用yarn yarn create vite 使用pnpm pnpx create-vite 根据提示输入项目名称,选择v ...

  8. 重大升级!灵雀云发布全栈云原生开放平台ACP 3.0

    云原生技术的发展正在改变全球软件业的格局,随着云原生技术生态体系的日趋完善,灵雀云的云原生平台也进入了成熟阶段.近日,灵雀云发布重大产品升级,推出全栈云原生开放平台ACP 3.0.作为面向企业级用户的 ...

  9. vps上安装CobaltStrike服务端

    今天我在我的vps上安装CobaltStrike服务端,真的是踩坑无数,所以写这篇博客记录一下,防止后人再踩坑 安装Oracle JDK8 官方不建议使用OpenJdk,建议使用Oracle JDK的 ...

  10. 创建VS Code 扩展插件

    VS Code提供了强大的扩展功能,我们可以通过开发插件实现自己的业务模型编辑器.这里我们快速介绍一下插件的创建.开发和发布过程. 创建插件开发模板 首先需要确认系统中安装了node.js,并且可以使 ...