SherlockGy's Blog

  • 首页

  • 关于

  • 标签

  • 分类

  • 归档

  • 搜索

Golang单元测试

发表于 2020-04-14 | 分类于 程序人生 > Golang
本文字数: 1.8k | 阅读时长 ≈ 2 分钟

Golang单元测试

[TOC]

一、约定的条件

  1. 包含单元测试的代码文件必须以_test.go结尾,否则测试框架并不会读区该文件作为测试代码。
  2. 单元测试文件名_test.go前面的部分建议是被测试的方法所在代码文件的文件名。
  3. 单元测试的函数名必须以Test开头,注意首字母是大写的。如果不满足则测试框架不会执行该函数。
  4. 函数名最好是Test+要测试的方法函数名,如TestAdd,表示测试的是Add这个这个函数。
  5. 测试函数的签名必须接收一个指向testing.T或testing.B类型的指针,且无返回值。

二、简单的样例

测试文件:test/demo_test.go

代码为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package test

import (
"testing"
)

func Add(a, b int) int {
return a + b
}

func TestAdd(t *testing.T) {
if result := Add(1, 2); result != 3 {
t.Errorf("测试Add函数报错,参数分别是%v and %v,返回结果为%v,期望是%v", 1, 2, result, 4)
}
}

三、如果对测试函数的执行顺序有要求

将单个测试用例的首字母小写,这样这个用例就不会被测试框架调用了

我们将测试方法传递给t的Run()方法,从而实现指定顺序执行单元测试

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
package test

import (
"testing"
)

func Add(a, b int) int {
return a + b
}

func testAdd1(t *testing.T) {
if result := Add(1, 2); result != 3 {
t.Errorf("测试Add函数报错,参数分别是%v and %v,返回结果为%v,期望是%v", 1, 2, result, 4)
}
}

func testAdd2(t *testing.T) {
if result := Add(3, 4); result != 7 {
t.Errorf("测试Add函数报错,参数分别是%v and %v,返回结果为%v,期望是%v", 1, 2, result, 4)
}
}

func TestAdd(t *testing.T) {
t.Run("test1", testAdd1)
t.Run("test2", testAdd2)
}
阅读全文 »

解决升级macOS catalina后VMware黑屏问题

发表于 2020-02-15 | 分类于 技巧分享 > 问题fix
本文字数: 1.4k | 阅读时长 ≈ 1 分钟

VMware软件的Mac版本名为VMware Fusion,该软件在你的Mac电脑安装了目前最新的macOS系统:catalina后,会出现黑屏的问题,而当你挂起虚拟机后,又可以看到虚拟机画面。这是由于自从catalina版本开始,应用程序需要自主申请各项权限,而旧版的VMware并不会申请屏幕录制权限,这就导致了黑屏的问题。

要想解决该问题,有三种方法:

  1. 将操作系统回退到之前版本,如果你有时间机器的备份,这应该比较容易
  2. 升级VMware,但是如果你是破解版,会出现破解失败,需要付费的情况
  3. 手动赋予VMware屏幕录制权限

这里重点介绍如何手动赋予VMware屏幕录制权限:

阅读全文 »

Mac如何卸载旧版Java

发表于 2020-02-09 | 更新于 2020-04-16 | 分类于 程序人生 > Java
本文字数: 374 | 阅读时长 ≈ 1 分钟

卸载步骤:

  1. 删除终端命令:
1
2
sudo rm -fr /Library/Internet\ Plug-Ins/JavaAppletPlugin.plugin
sudo rm -fr /Library/PreferencesPanes/JavaControlPanel.prefPane
  1. 删除JDK包

先查看已安装了哪些版本的Java

1
ls /Library/Java/JavaVirtualMachines/

再进入目录,删除对应版本的Java

1
2
cd /Library/Java/JavaVirtualMachines/
sudo rm -rf jdk[_update].jdk
  1. 删除偏好设置面板图标
1
sudo rm -fr /Library/PreferencePanes/JavaControlPanel.prefPane
阅读全文 »

Java踩坑——Double类型转String变成了科学计数法怎么解决

发表于 2019-11-28 | 更新于 2019-11-29 | 分类于 程序人生 > Java
本文字数: 1.3k | 阅读时长 ≈ 1 分钟

现在有一个场景,需要将一个Double类型的字段转换成字符串然后写入文件,不过在某些时候,数字会出现以科学计数法的形式来表示:

1
2
3
4
double scale = 0.0005;
System.out.println(String.valueOf(scale)); // 5.0E-4
System.out.println(scale + ""); // 5.0E-4
System.out.println(scale); // 5.0E-4

如上,在尝试了几种容易想到的方法后,发现均不可行.后来经过搜索和更多次尝试,整理出几种方案:

方案一

使用java.math包的BigDecimal类.效果如下:

1
2
3
double scale = 0.0005;
BigDecimal bigDecimal = new BigDecimal(scale);
System.out.println(bigDecimal); // 0.0005000000000000000104083408558608425664715468883514404296875

由于BigDecimal直接使用不符合我们对小数点后长度的需求,就需要使用String.format()的方式进行转换:

1
2
3
double scale = 0.0005;
BigDecimal bigDecimal = new BigDecimal(scale);
System.out.println(String.format("%.4f", bigDecimal)); // 0.0005

至此问题貌似是解决了,但是依然很不放心.主要原因在于这种方式还是有可能导致误差:毕竟本来我的数字就是标准的0.0005,而BigDecimal因为精度原因需要做截取.

虽然目前看似没有问题,但是如果出现BigDecimal将结果输出成:0.0004999999999999之类的怎么办呢?

这个时候又想到了四舍五入之类的方法,但是总感觉与真正的方法相去越来越远:这么简单的一个转换,不应该搞得这么复杂,于是有了方案二

方案二

这一次是使用java.text包下的DecimalFormat类,具体实现如下:

1
2
3
double scale = 0.0005;
DecimalFormat decimalFormat = new DecimalFormat("#.####");
System.out.println(decimalFormat.format(scale)); // 0.0005

方案三

后来想起来,发现其实上面两种方法都是庸人自扰,属于脑子一下没转过弯来才会干的事…因为实际上问题可以非常简单地解决:

1
2
3
double scale = 0.0005;
String scaleStr = String.format("%.4f", scale);
System.out.println(scaleStr); // 0.0005

好吧,果然这种问题的解决办法一定是非常简单的…

阅读全文 »

Redis系统学习

发表于 2019-11-28 | 更新于 2020-02-08 | 分类于 数据库 > Redis
本文字数: 18k | 阅读时长 ≈ 16 分钟

Redis系统学习

一、什么是Redis?

  1. Redis是用C语言开发的一个开源、免费、高性能键值对内存数据库
  2. 它提供5种数据类型来存储值:字符串类型、散列类型、列表类型、集合类型、有序集合类型
  3. 他是一种NoSQL数据库
  4. 可用于缓存、内存数据库、消息队列等

1.1 什么是NoSQL?

  • NoSQL,即Not-Only-SQL,泛指非关系型数据库
  • NoSQL数据库为了解决高并发、高可用、高可拓展、大数据存储问题而产生的数据库解决方案
  • NoSQL可以作为关系型数据库的良好补充,但不是替代关系型数据库

1.2 NoSQL数据库分类

1.2.1 键值存储数据库

相关产品: Tokyo Cabinet/Tyrant、Redis、Voldemort、Berkeley DB

典型应用: 内容缓存,主要处理大量数据的高访问负载

数据模型: 一系列键值对

优势: 快速查询

劣势: 存储的数据缺少结构化

1.2.2 列存储数据库

相关产品: Cassardra、HBase、Riak

典型应用: 分布式的文件系统

数据模型: 以列簇式存储,将同一列数据存在一起

优势: 查找速度快、可拓展性强,更容易进行分布式拓展

劣势: 功能相对局限

1.2.3 文档型数据库

说明: 与Key-Value类似,Value是结构化的,即可嵌套

相关产品: Mongo DB、Couch DB

典型应用: Web应用

数据模型: 一系列键值对

优势: 数据结构要求不严格

1.3 Redis的应用场景

  • 内存数据库(登陆信息、购物车信息、用户浏览记录等)
  • 缓存服务器(商品数据、广告数据等)
  • 解决分布式集群架构中的session分离问题(session共享)
  • 任务队列(秒杀、抢购、12306等)
  • 支持发布-订阅的消息模式
  • 应用排行榜
  • 网站访问统计
  • 数据过期处理(精确到毫秒)

二、安装启动

2.1 解压二进制安装包

1
2
3
4
$ tar -xf redis-3.2.9.tar.gz # 加上-z参数可以显示解压进度
$ cd redis-3.2.9
$ make # 需要安装GCC
$ make install PREFIX=/redis # 指定安装目录安装

2.2 启动

2.2.1 前端启动

1
2
3
4
# 直接运行bin/redis-server将以前端模式启动
$ ./redis-server

# ctrl + c关闭

2.2.2 守护进程启动

  1. 修改redis-conf配置文件,将文件中的daemonize项改为yes
  2. bind 127.0.0.1改为bind <redis实例所在机器的真实IP>,如:bind 192.168.10.133(本地测试忽略)
1
2
3
4
5
6
7
8
# 指定配置文件位置启动
$ redis-server /usr/local/bin/redis.conf

# 检查是否启动成功
$ ps -ef | grep redis

# 关闭redis
$ ./redis-cli shutdown
阅读全文 »
1234…23
SherlockGy

SherlockGy

Keep thinking different...

111 日志
38 分类
62 标签
RSS
GitHub E-Mail
友情链接
  • GoLang-飞雪无情的博客
  • Java-酷壳
  • Python-静觅丨崔庆才的个人博客
  • 掘金
  • GoLang中国
  • GoLang中文社区
  • V2EX
  • Microsoft Docs
  • Go语言圣经
© 2020 SherlockGy | 191k | 2:false
由 Hexo 强力驱动 v3.7.1
|
主题 — NexT.Pisces v6.3.0