day 9 - 小范围开发 & go test

专案的档案结构规划好之後, 就可以依照每支档案负责的工作填好对应的内容再组装起来。如果在组装之前能确定好零件的品质, 结果会不会顺利一点呢?
就像组装模型之前, 可以先把零件一个一个拿出来检视, 先确定没有破损或缺漏, 处理好汤口, 这样组装的过程或许就能减少突发状况以及降低因为某个零件需要重新调整而影响进度的状况。专案的每个零件如果能先个别经过测试, 确保每个零件的输入输出都是符合预期的, 这样在最後整合测试时也能加速问题的排除。

我通常会从核心操作的部分先着手: 像是复杂的计算逻辑或对db、redis的操作就会是我先进行的项目。
这次模拟专案会操作到redis, 在我开始写程序之前, 我会先用redis-cli测试预计要使用的语法跟结构, 确定可以做出需要的效果之後再开始写程序码。redis 它提供了很多好用的结构, 初步模拟的redis操作只有Set&Get, 我会依照操作的行为分别写好funcion进行测试, 先确定最小操作的function功能没问题。此外, 如果是会重复的项目, 像是redis key就要另外写一个统一取得的接口, 避免散落在各处, 遇到要修改时容易漏改。

在redis资料夹中写好会使用到的操作逻辑

redis
└── limit.go
//(... 略)

// set point
func PointSet(conn *redis.Client, key string, value int, expired time.Duration) (err error) {
	_, err = conn.IncrBy(key, int64(value)).Result()
	if err != nil {
		return
	}

	_, err = conn.Expire(key, expired).Result()
	if err != nil {
		return
	}
	return
}

// get point
func PointGet(conn *redis.Client, key string) (reply int, err error) {
	reply, err = conn.Get(key).Int()
	if err != nil {
		return
	}

	return
}

写完之後可以直接写 go test程序进行逻辑验证。

redis
├── limit.go
└── limit_test.go
//(... 略)

func TestPoint(t *testing.T) {
	conn, err := newRedisConnection()
	if err != nil {
		t.Error("newRedisConnection Error:", err)
	}

	sets := &KeySet{
		Level1:   "AA",
		Level2:   "B",
		Level3:   "CCC",
		UserName: "Coconut",
	}

	keys := GetPointKey(sets)

	for _, v := range keys {
		originPoint, err := PointGet(conn, v)
		if err != nil {
			if err != redis.Nil {
				t.Error("PointGet origin Error:", err)
			}
		}

		err = PointSet(conn, v, 100, time.Duration(30)*time.Second)
		if err != nil {
			t.Error("PointSet Error:", err)
		}

		resultPoint, err := PointGet(conn, v)
		if err != nil {
			t.Error("PointGet result Error:", err)
		}

		if resultPoint != originPoint+100 {
			t.Error("Set point Error")
		}
	}

}

执行 go test -v -cover=true

=== RUN   TestPoint
--- PASS: TestPoint (0.04s)
PASS
coverage: 81.2% of statements
ok      github.com/evelynocean/coconut/redis    0.440s

写完逻辑同时写好test的优点是:如果之後有异动到逻辑, 只需要重跑 go test就可以确保输出有符合预期。go test 的内容可以涵盖逻辑验证、计算结果检查、格式检查、边界值检查...等, 测试写得越完整就越有保障喔~


<<:  [13th][Day9] docker image-1

>>:  [13th][Day7] func -1

懂很多的工程师最恐怖

有些比较大型、而且有规划要进行客制销售的专案,它在程序工程上有几个阶段,首先是「确立技术可行性」,然...

[Day27] 监视股价 - Watcher

找到股价站上 20 周线只是第一步,不是一站上就会开始飙升,我还会搭配价位突破「箱型区间」,这个突破...

Autofac 如何协助 .NET Core MVC 做 Dependency Injection- 图解概述

Autofac为可以帮忙达成DI的套件,其运作可以参考运作描述,与如何协助ASP.NET MVC达...

14.移转 Aras PLM大小事-开发报表 Where Used Top Level Product

本篇放上获得最上阶产品料号的作法 1.建立报表 2.设定SQL语法 3.设定Method 4.设定X...

《Day28》Oracle Database的基础架构

Oracle Database主要由实体档案与记忆体结构配置组合而成的。 可以参考下图: 介绍Ora...