package chapter03
import "math"
type Slice struct{
Y_slice []float64 //真实值
Y_eslice []float64 //预测值
Mean_error []float64 //误差
}
func (this *Slice) Error(arr1 []float64,arr2 []float64) (arr3 []float64){
for i := 0;i < len(arr1);i++{
arr3 = append(arr3,0)
}
for index,value := range arr1{
arr3[index] = value - arr2[index]
}
return arr3
}
func (this *Slice) MeanError(arr3 []float64) float64{
sum := 0.0
for _,value := range arr3{
sum += math.Pow(value,2)
}
return sum
}
package chapter03
import (
"testing"
"fmt"
)
func TestCal(t *testing.T) {
s := Slice{
Y_slice : []float64{20.3,20.5,21.5,21.8,22.0,22.5,22.6,23.3},
Y_eslice : []float64{20.2,20.3,21.6,21.6,21.9,22.6,22.8,23.2},
}
s.Mean_error = s.Error(s.Y_slice,s.Y_eslice)
average := s.MeanError(s.Mean_error)
if average > 0.5{
t.Fatalf("误差平方和为%v大于设定值0.5!",average)
}else{
fmt.Printf("误差平方和为%v小于设定值0.5!\n",average)
}
t.Logf("测试成功!")
}
测试结果:
=== RUN TestCal
误差平方和为0.1700000000000006小于设定值0.5!
TestCal: cal_test.go:20: 测试成功!
— PASS: TestCal (0.00s)
PASS
ok go_code/project01/chapter03 0.406s
若对Y_eslice稍作改动使得所得误差平方和大于0.5,所得测试结果如下:
=== RUN TestCal
TestCal: cal_test.go:16: 误差平方和为23.170000000000012大于设定值0.5!
— FAIL: TestCal (0.00s)
FAIL
exit status 1
FAIL go_code/project01/chapter03 0.342s
首先看一下Fatalf的官方文档:
func (c *B) Fatalf(format string, args …interface{})
调用 Fatalf 相当于在调用 Logf 之后调用 FailNow 。
FailNow的官方文档:
func (c *B) FailNow()
将当前的测试函数标识为“失败”,并停止执行该函数。在此之后,测试过程将在下一个测试或者下一个基准测试中继续。 FailNow 必须在运行测试函数或者基准测试函数的 goroutine 中调用,而不能在测试期间创建的 goroutine 中调用。调用 FailNow 不会导致其他 goroutine 停止。
Logf的官方文档:
func (c *B) Logf(format string, args …interface{})
Log 使用与 Printf 相同的格式化语法对它的参数进行格式化, 然后将格式化后的文本记录到错误日志里面。 如果输入的格式化文本最末尾没有出现新行, 那么将一个新行添加到格式化后的文本末尾。
对于测试来说,Logf 产生的格式化文本只会在测试失败或者设置了 -test.v 标志的情况下被打印出来; 对于基准测试来说, 为了避免 -test.v 标志的值对测试的性能产生影响, Logf 产生的格式化文本总会被打印出来。
通过官方文档我们发现,Fatalf方法先调用Logf,将错误信息记录到日志中,再调用FailNow结束该测试函数的执行。一旦编译器检测到不满足条件需要执行Fatalf语句时,该测试函数的后续语句将不会被执行!