go 测试和文件

news2024/10/6 12:30:45

go 测试和文件

  • 需求
  • 传统测试
  • 单元测试
  • 牛刀小试
  • 总结
  • 练习
  • 文件介绍
    • 打开关闭文件
    • 读文件
    • 一次性读取文件
    • 写文件
    • 文件或文件夹是否存在
    • 文件拷贝

需求

有一个函数,怎样确认他运行结果是正确的?

func addUpper(n int)int  {
	res := 0
	for i := 1; i <= n; i++ {
		res+=1
	}
	return res
}

传统测试

在main中测试
缺点

  1. 不方便
  2. 不利于管理

单元测试

Go语言中自带有一个轻量级的测试框架testing和自带的go test命令来实现单元测试和性能测试,testing框架和其他语言中的测试框架类似,可以基于这个框架写针对相应函数测测试用例,也可以基于该框架写相应的压力测试用例,解决如下问题:

  1. 确保每个函数可行性
  2. 确保代码性能是好的
  3. 及时规避问题

牛刀小试


import (
	"testing"
	"wiaf.org/zhouhongjie/demo1/util"
)

func TestAddUpper(t *testing.T) {
	res := util.AddUpper(3)
	if res != 55 {
		t.Fatalf("Addupper(3) 执行错误,期望值 %v 实际值 %v ", 55, res)
	}
	t.Logf("Addupper(3) 运行正确")
}
func TestOk(t *testing.T) {

	t.Logf("测试TestOk 运行正确")
}

在这里插入图片描述
cd 到一 _test.go结尾的目录下,执行 go test -v,其下每一个测试用例方法都会执行

总结

  • 测试用例文件必须以 _test.go 结尾
  • 测试用例方法 必须是 TestXxx 的格式
  • 一个测是用例可以有多个测试用例函数
  • go test -v 会输出正确或错误的;go test 只会输出错误的
  • 测试某个文件(这里测试两个) go test -v cal_test.go cal.go
  • 测试某个方法 go test -v -test.run TestAddUpper

练习

package util

import (
	"encoding/json"
	"log"
)

type Monster struct {
	Name  string `json:"name"`
	Age   string `json:"age"`
	Skill string `json:"skill"`
}

func Serialize(monster Monster) string {
	marshal, err := json.Marshal(monster)
	if err != nil {
		log.Fatalf("序列化失败 ", err)
	}

	return string(marshal)

}

func UnSerialize(strMonster string) (monster *interface{}) {
	err := json.Unmarshal([]byte(strMonster), monster)
	if err != nil {
		log.Fatalf("反序列化失败 ", err)
	}
	return monster
}

package test

import (
	"testing"
	"wiaf.org/zhouhongjie/demo1/util"
)

func TestSerialize(t *testing.T) {
	monster := util.Monster{
		Name:  "牛魔王",
		Age:   "13",
		Skill: "牛角功",
	}
	serialize := util.Serialize(monster)
	t.Logf(serialize)
}

func TestUnSerialize(t *testing.T) {
	monster := util.UnSerialize("{\"name\":\"牛魔王\",\"age\":\"13\",\"skill\":\"牛角功\"}")
	u, ok := (*monster).(util.Monster)
	if ok {
		t.Log("转换成功 ", u)
	} else {
		t.Log("转换失败  ", u)

	}

}

文件介绍

文件在程序中以流的形式来操作的
输入流:程序 -> 文件
输出流:文件 -> 程序

os.File 封装文件相关操作
在这里插入图片描述

打开关闭文件


func TestFileBaseOpr(t *testing.T) {
	file, err := os.Open("/Users/mac/Desktop/diagram")
	defer func(file *os.File) {
		err := file.Close()
		if err != nil {
			t.Fatal("关闭文件错误", err)
		}
	}(file)
	if err != nil {
		t.Fatal("打开文件失败", err)
	}
	t.Log("文件名称 ", file.Name())

}

读文件

func TestFileBaseOpr(t *testing.T) {
	file, err := os.Open("/Users/mac/go/src/wiaf.org/zhouhongjie/demo1/main/main.go")
	defer func(file *os.File) {
		err := file.Close()
		if err != nil {
			t.Fatal("关闭文件错误", err)
		}
	}(file)
	if err != nil {
		t.Fatal("打开文件失败", err)
	}
	t.Log("文件名称 ", file.Name())

	reader := bufio.NewReader(file)

	for {
		readString, err := reader.ReadString('\n')
		if err == io.EOF {
			break
		}
		t.Log(readString)
	}
	 
}

一次性读取文件

func TestFileBaseOpr(t *testing.T) {
	// 这个包里边都过期了
	file, err := ioutil.ReadFile("/Users/mac/go/src/wiaf.org/zhouhongjie/demo1/test/cal1_test.go")
	if err != nil {
		t.Fatal("读取文件失败", err)
	}
	t.Log(string(file))
}

写文件

func TestFileBaseOpr(t *testing.T) {
	file, err := os.OpenFile("./text.txt", os.O_CREATE|os.O_APPEND, 0777)
	defer func(file *os.File) {
		err := file.Close()
		if err != nil {
			t.Fatal("关闭失败", err)
		}
	}(file)
	if err != nil {
		t.Fatal("打开失败", err)
	}

	writer := bufio.NewWriter(file)
	_, err = writer.Write([]byte("hello world"))
	if err != nil {
		t.Fatal("写入失败", err)

	}
	err = writer.Flush()
	if err != nil {
		t.Fatal("刷盘失败", err)
	}

}

文件或文件夹是否存在


func PathExists(path string) (bool, error) {
	_, err := os.Stat("./text.txt")
	if err == nil {
		return true,nil
	}
	if os.IsNotExist(err){
		return false,nil
	}
	return false,err
}

文件拷贝

package test

import (
	"bufio"
	"fmt"
	"io"
	"os"
	"testing"
)

func CopyFile(dstFileName string, srcFileName string) (written int64, err error) {
	srcFile, err := os.Open(srcFileName)
	if err != nil {
		fmt.Print("open file error", err)

	}
	reader := bufio.NewReader(srcFile)
	dstFile, err := os.OpenFile(dstFileName, os.O_WRONLY|os.O_CREATE, 0666)
	if err != nil {
		fmt.Printf("open file err = %v", err)
		return
	}
	writer := bufio.NewWriter(dstFile)
	defer dstFile.Close()

	return io.Copy(writer, reader)
}
func TestFileBaseOpr(t *testing.T) {
	CopyFile("./text.mp4", "/Users/mac/Desktop/硬件基础/day01/03_电学基础_电阻.mp4")
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1627444.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

牛客NC368 质数的计数【中等 基础数学,数论 C++/Java/Go/PHP】

题目 题目链接&#xff1a; https://www.nowcoder.com/practice/190167d1990442da9adb133980259a27 思路 判断x是否是质数&#xff1a;这是判断质数最好的代码了public boolean isPrime(int x){if(x 2 || x3) return true;if(x%6!1 && x%6!5) return false; //不在6倍…

微服务之分布式理论概述

一、分布式技术相关的理论 CAP理论 CAP定理(CAP theorem)&#xff0c;⼜被称作布鲁尔定理(Eric Brewer)&#xff0c;1998年第⼀次提出. 最初提出是指分布式数据存储不可能同时提供以下三种保证中的两种以上: (1) ⼀致性(Consistency): 每次读取收到的信息都是最新的; (2) …

7天入门Android开发之第1天——初识Android

一、Android系统 1.Linux内核层&#xff1a; 这是安卓系统的底层&#xff0c;它提供了基本的系统功能&#xff0c;如内存管理、进程管理、驱动程序模型等。安卓系统构建在Linux内核之上&#xff0c;借助于Linux的稳定性和安全性。 2.系统运行库层&#xff1a; 这一层包括了安卓…

Python用于高级异常检测和聚类的工具库之BanditPAM使用详解

概要 Python BanditPAM库是一个用于高级异常检测和聚类的工具,具有强大的特性和灵活的功能,可以发现数据中的异常点并进行有效的聚类分析。本文将详细介绍Python BanditPAM库的安装、特性、基本功能、高级功能以及总结。 安装 首先,需要安装Python BanditPAM库。 可以使用…

Hadoop之路

hadoop更适合在liunx环境下运行&#xff0c;会节省后期很多麻烦&#xff0c;而用虚拟器就太占主机内存了&#xff0c;因此后面我们将把hadoop安装到wsl后进行学习,后续学习的环境是Ubuntu-16.04 &#xff08;windows上如何安装wsl&#xff09; 千万强调&#xff0c;有的命令一…

Python-VBA函数之旅-list函数

目录 一、list函数的常见应用场景&#xff1a; 二、list函数使用注意事项&#xff1a; 三、如何用好list函数&#xff1f; 1、list函数&#xff1a; 1-1、Python&#xff1a; 1-2、VBA&#xff1a; 2、推荐阅读&#xff1a; 个人主页&#xff1a;https://blog.csdn.net…

2015-2023年上市公司商道融绿ESG评级数据

2015-2023年上市公司商道融绿ESG评级数据 1、时间&#xff1a;2015-2023年 2、来源&#xff1a;整理自WIND 3、指标&#xff1a;代码、名称、商道融绿ESG评级 4、范围&#xff1a;上市公司 5、指标解释&#xff1a; 商道融绿ESG评级体系是一种全新的评级体系&#xff0c;…

Restful API 具体设计规范(概述)

协议 https 域名 https://www.baidu.com/api 版本 https://www.baidu.com/v1 路径 https://www.baidu.com/v1/blogs 方法 数据过滤 状态码返回结果 返回的数据格式 尽量使用 JSON&#xff0c;避免使用 XML。 总结&#xff1a; 看 url 就知道要什么看 http method 就知道干…

【网络技术】【Kali Linux】Wireshark嗅探(十一)以太网Ethernet协议报文捕获及分析

往期 Kali Linux 上的 Wireshark 嗅探实验见博客&#xff1a; 【网络技术】【Kali Linux】Wireshark嗅探&#xff08;一&#xff09;ping 和 ICMP 【网络技术】【Kali Linux】Wireshark嗅探&#xff08;二&#xff09;TCP 协议 【网络技术】【Kali Linux】Wireshark嗅探&…

BUUCTF--web(2)

1、[HCTF 2018]admin1 打开题目后发现有注册和登录两个页面&#xff0c;因为题目提示admin&#xff0c;尝试用admin进行爆破 爆破得到密码为123 登录得到flag 2、[护网杯 2018]easy_tornado1 打开题目后有三个文件&#xff0c;分别打开查看 在url地址栏中发现包含两个参数&a…

DBSCAB算法介绍(Python3实现)

一、DBSCAB算法简介 1、DBSCAN算法 基于密度的空间聚类的应用(Density-based spatial clustering of applications with noise&#xff0c;DBSCAN)算法是由Martin Ester, Hans-Peter Kriegel, Jrg Sander和Xiaowei Xu于1996年提出的一种聚类分析算法。 其原始论文是在1996年的…

ASP.NET某企业信息管理系统的设计与实现

摘 要 信息管理系统就是我们常说的MIS(Management Information System),它是一个计算机软硬件资源以及数据库的人-机系统。经过对题目和内容的分析,选用了Microsoft公司的ASP.NET开发工具,由于它提供了用于从数据库中访问数据的强大工具集,使用它可以建立开发比较完善的数据库…

untiy avpro播放超过8K视频的解决方案

安转LAV Filters解码器&#xff0c;然后指定Avpro使用这个解码器播放即可 第一步 安装解码器 下载链接 第二步 AVPro设置 MediaPlayer脚本中一共两处

计算完美数

一、概要 完全数&#xff08;Perfect number&#xff09;&#xff0c;又称完美数或完备数&#xff0c;是一些特殊的自然数。 它所有的真因子&#xff08;即除了自身以外的约数&#xff09;的和&#xff08;即因子函数&#xff09;&#xff0c;恰好等于它本身。 例如&#xf…

排序算法-计数排序

一、计数排序 这种排序算法 是利用数组下标来确定元素的正确位置的。 如果数组中有20个随机整数&#xff0c;取值范围为0~10&#xff0c;要求用最快的速度把这20个整数从小到大进行排序。 很大的情况下&#xff0c;它的性能甚至快过那些时间复杂度为O(nlogn&#xff09;的排序。…

API和微服务设计的优化方式有哪些?

在构建响应迅速、用户体验良好的应用程序中&#xff0c;API性能的优化至关重要。在构建高性能的API时&#xff0c;采取综合策略是至关重要的。通过采用一系列策略&#xff0c;我们可以确保API在处理请求时高效运行&#xff0c;提供流畅的服务。 一、API和微服务设计的优化可以…

Linux系统安全及应用(1)

目录 一.账号安全控制 系统账号清理 二.密码安全控制 密码安全控制 三.命令历史限制 命令历史限制 四.限制su切换用户 1&#xff09;将信任的用户加入到wheel组中 2&#xff09;修改su的PAM认证配置文件 ​编辑五.PAM认证的构成 六.使用sudo机制提升权限…

机器人系统ros2-开发实践03-监听节点的参数变化(C++)

背景&#xff1a; 通常&#xff0c;节点需要响应其自身参数或另一个节点参数的更改。 ParameterEventHandler 类可以轻松侦听参数更改&#xff0c;以便您的代码可以响应它们。本教程将向您展示如何使用 ParameterEventHandler 类的 C 版本来监视节点自身参数的更改以及另一个节…

深入了解Semaphore、CountDownLatch等实用工具的用法

哈喽&#xff0c;各位小伙伴们&#xff0c;你们好呀&#xff0c;我是喵手。 今天我要给大家分享一些自己日常学习到的一些知识点&#xff0c;并以文字的形式跟大家一起交流&#xff0c;互相学习&#xff0c;一个人虽可以走的更快&#xff0c;但一群人可以走的更远。 我是一名后…

Android使用ProtoBuf 适配 gradle7.5 gradle8.0

ProtoBuf 适配 Gradle7.5 gradle-wrapper.properties 配置 distributionUrlhttps\://services.gradle.org/distributions/gradle-7.5-bin.zipProject&#xff1a;build.gradle: plugins {id com.android.application version 7.4.2 apply falseid com.android.library versio…