如何编写脚本对项目代码进行分析(测试篇)

2023-11-04

本篇将从一个测试的角度,对于在开发过程中,如何对代码进行完善的测试(包括功能以及性能的测试)。(内容属于杂谈,可能不够严谨,但希望能帮到看到这篇文章的各位)

前言

我想没有人会质疑测试的重要性,我们自己编写的代码,可能需要经过很多次的测试才能上线使用。有些bug可能是微不足道的,但是有些bug则可能是致命的。要想尽早的消灭这些bug,那么测试就成了非常重要的一环。

对于测试,有着非常多的资料,也有着非常成熟的理论体系。而且还有一种开发方式叫做
Test-Driven Developmen ,即"测试驱动开发",通常也被简称为TDD。其大致思想是,在开发功能代码之前,先编写测试的代码,再编写功能代码,也就是所谓"测试先行"。

对于测试,也有着非常多的分类,下面是其常见的分类方式:
(1)按照是否需要执行软件,可以分为静态测试动态测试
(2)按照软件开发阶段,可以分为单元测试、集成测试、系统测试、验收测试、回归测试等
(3)按照测试方法来分,可以分为黑盒测试白盒测试灰盒测试等。

单元测试(unittest)

本篇主要介绍的是单元测试,它是离开发人员最近的测试,这种测试通常由开发人员来完成,而不是由测试人员来完成,它通常是由开发人员来判断自己的开发是否符合需求。

在单元测试中,如何去划分这些单元是非常重要的,一般我们都会按照类里面的方法为单位来划分各个单元,也就是类里面的一个方法就是一个单元,我们对它们进行逐个测试,也就是我们的单元测试。

在Python中,有数量众多的单元测试框架和工具,比如unittest、testtools、subunit、nose、pytest等等,由于它们都是用来做单元测试的,因此它们的使用方式都是非常相似的。

我个人比较倾向于使用nose,首先,我们都知道,unittest是python提供的用于单元测试的标准模块。而nose正是基于这个模块开发出的第三方框架,并且有着更好的易用性。

使用unittest编写测试脚本需要将其编写成为一个测试类,而nose不仅可以使用unittest的测试用例,并且可以支持使用函数进行测试。

至于具体如何使用nose,我就不赘述了,官方文档以及众多的博客资料肯定会比我写的更加详细。在这里,我想说明的是:

如何编写脚本对项目代码进行分析

想要更好的了解如何编写测试脚本,我们必须明确两点:

一、数据
测试中最麻烦的地方永远不在于测试脚本的编写,而在于对于数据的准备环节,这真的是一个累人的活_(:з)∠)_
准备的数据一般可以有两个来源:

1、来自于项目的真实数据,这类数据通常是比较可靠的(废话),但缺点是不够灵活。使用起来略显麻烦。

2、自己构造,根据函数预期的功能自定义数据。优点是方便且可控,缺点是可能cover不到一些边边角角的地方。

那么,我们需要准备那些数据呢?

一般来说,针对一个单元,一般是有若干个输入;而我们也是通过函数的输出来判断函数功能是否达到预期的要求。

理所应当的,我们需要准备数据应该包括预期的输入数据预期的输出数据
而且这个数据一旦准备好了,一般是不会轻易改变的(除非是函数的功能改变了),所以,从时间点上来看:

---------------------------------------这是时间线---------------------------------------
  ↑                           ↑
→预期输入A                     →预期输入A
预期输出B→                     预期输出B→

看,在这条时间线上,你所准备的数据始终是不变的(或者说不能变,因为这就是判断函数功能的依据)。随着版本的开发,函数内部可能被重构,但是输入和输出的变动将会是很小的(个人见解)。

二、脚本

数据准备好了,接下来改写脚本了,这里又牵扯到一个问题,你的单元测试脚本:
1、应该写在哪里?
2、data和脚本是否应该分开。
3、你所需要测试的函数是否适合进行单元测试(个人认为比较重要)?

ok,针对上面的问题一个一个的进行分析:

首先,针对前两个问题,亮出我的看法:你的测试脚本应该和项目源代码各自独立开来。并且不应该放到离你的被测代码太远的地方(方便查找),比如,你可以把你的测试代码用一个test package装起来~

理由有二:
1、方便管理,可以很方便的进行修改,而不用每次都在大段的代码里定位自己的测试函数。

2、显得有调理,一堆源代码里零零散散的穿插着测试代码,看着不揪心么_(:з)∠)_

而第3个问题,则是针对开发环节就应该注意的问题。即代码的耦合性问题。
举个例子:
当你要对使用某个框架(例如Django)开发的项目中的某个函数进行测试,你可能会遇到如下这些问题:
1、你的函数代码和框架的耦合性太高,直接导致你的测试脚本无法直接调用这个函数。结果就是,你为了把这个函数剥离出来而不得不对其进行重构以适应单元测试的需要。(但这无法从根本解决这个问题,当函数发生改变时,你不得不重新开始构造)

2、函数中存在着过多和此次测试无关的参数或者涉及到数据库的操作。在进行测试的环节,这些参数或者操作就是对你的阻碍。通常比较好的做法是:使用Mock,将这些无关紧要的东西用你准备好的数据屏蔽掉。从而把注意力放在你真正关心的事情上面。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何编写脚本对项目代码进行分析(测试篇) 的相关文章

随机推荐

  • linux下C程序查看内存剩余大小

    嵌入式linux中很多内存资源都比较小 所以很多程序中在malloc时就需要提前知道内存剩余的大小 下面是一种调用 sysinfo接口来实现 示例代码如下 include
  • java--基础--16.8--IO流--打印流

    java 基础 16 8 IO流 打印流 1 介绍 1 1 分类 字节流打印流 PrintStream 字符打印流 PrintWriter 1 2 特点 只有写数据的 没有读取数据 只能操作目的地 不能操作数据源 可以操作任意类型的数据 如
  • 东北大学acm训练第四周(搜索)

    include
  • 在mac上配置vue开发环境

    1 在mac上安装brew brew 是 Mac 下的一个包管理工具 没有安装brew 检测用 brew v 则执行下面的命令安装 usr bin ruby e curl fsSL https raw githubusercontent c
  • sqli-18

    1 1 updatexml 1 concat 0x5c select group concat table name from information schema tables where table schema security
  • springMvc自定义校验注解

    spring 自定义注解 翻看公司代码 看到了自定义的注解 查了查 再次记录一下 还是太菜 下面是我的实现 1 自定义注解 package com test import javax validation Constraint import
  • 多核编程 与 单核多线程编程的区别

    一 首先声明 并行 两件 多件 事情在同一时刻一起发生 并发 两件 多件 事情在同一时刻只能有一个发生 由CPU快速切换 从而给人的感觉是同时进行 使用多线程来实现并行计算来缩短计算时间时 只要在多核CPU下才行 单核CPU下启用多线程最终
  • mac安装php8和apache

    如果自己在mac安装php 会涉及证书问题 而用brew方法安装 即可自动关联 省心省力 删除mac自带的apache sudo launchctl unload w System Library LaunchDaemons org apa
  • spring 或者spring boot 调整bean 的加载顺序:

    spring 或者spring boot 调整bean 的加载顺序 接下来讲解三种调整类加载顺序的方式 1 使用 Order调整配置类加载顺序 Configuration Order 1 public class ConfigA Bean
  • web安全之XSS攻击原理及防范

    一 什么是XSS攻击 二 反射型XSS 三 存储型XSS 四 DOM based型XSS 五 SQL注入 六 XSS如何防范 1 cookie安全策略 2 X XSS Protection设置 3 XSS防御HTML编码 4 XSS 防御H
  • JSON简单例子-1

    package com xuankai json import org json JSONArray import org json JSONObject public class Test public static void main
  • Java 中Map五种取值方式

    map的主要作用是什么 可以通过创建一个map的实现类 来存放 数据 值 和值的描述 也可以通过描述去取得数据 将键映射到值的对象 一个映射不能包含重复的键 每个键最多只能映射到一个值 此接口取代 Dictionary 类 后者完全是一个抽
  • python的@property有什么用?

    从本质上讲 property是一个语法糖 语法糖是python里老生常谈的事务了 比方说 最基础的len iterable 函数 其实是通过调用iterable len 方法实现的 只是pythonic的理念让我们习惯并且喜欢上使用诸如fu
  • EMWIN显示中文

    上面是我创建的群聊 欢迎新朋友的加入 安装软件 在桌面新建TXT 文件另存为 打开软件 选择字体和大小 取消所有已选内容 导入刚刚的文件 都在edit下面 截图不了 另存为C文件 导入工程 后面的问号不是乱码 是字符 后面整理一下文件 就是
  • Klocwork — 符合功能安全要求的自动化静态测试工具

    Klocwork 符合功能安全要求的自动化静态测试工具 Klocwork工具应用静态分析技术 可实现对C C Java等代码的全面静态分析 检查问题种类既包含软件质量和安全缺陷相关 也可实现多种语言编码规则规范的检查 通过使用Klocwor
  • QCC300x笔记(6) -- QCC3007的OTA流程梳理

    哈喽大家好 这是该系列博文的第六篇 篇 lt lt 系列博文索引 快速通道 gt gt 写在前面 QCC300x支持OTA功能 官方提供了详细的文档说明 按照文档即可升级成功 下面是对流程的简单梳理 可参考 文档和APP下载 1 生产APP
  • C语言解析FLM(ELF)格式文件

    C语言解析FLM ELF 格式文件 代码下载 https gitee com jhembedded flmparse 1 前言 写这篇博客的目的是因为最近在做一个STM32的离线编程器 离线下载需要用到FLM文件的下载算法 所以实现了一下提
  • [人工智能-深度学习-28]:卷积神经网络CNN - 网络架构与描述方法

    作者主页 文火冰糖的硅基工坊 文火冰糖 王文兵 的博客 文火冰糖的硅基工坊 CSDN博客 本文网址 https blog csdn net HiWangWenBing article details 120806599 目录 第1章 卷积神
  • Spring Boot Event Bus用法

    Spring Boot Event Bus是Spring框架中事件驱动编程的一部分 它为应用程序中的不同组件提供了一种解耦的方式 以便它们可以相互通信和交互 以下是Spring Boot Event Bus的用法 导入依赖 首先 您需要在项
  • 如何编写脚本对项目代码进行分析(测试篇)

    本篇将从一个测试的角度 对于在开发过程中 如何对代码进行完善的测试 包括功能以及性能的测试 内容属于杂谈 可能不够严谨 但希望能帮到看到这篇文章的各位 前言 我想没有人会质疑测试的重要性 我们自己编写的代码 可能需要经过很多次的测试才能上线