Frequently Asked Questions:哪里能找到最好的测试工具方法,runtime运行时是怎么实现的

198 阅读2分钟

这是我参与11月更文挑战的第3天,活动详情查看:2021最后一次更文挑战

Go的标准测试包testing使其易于编写单元测试,但它缺少其他语言测试框架中提供的功能,例如断言功能。这个文档解释了为什么早期Go没有断言,并且相同的,一些参数不适用于assert。适当的错误处理意味着在一个失败之后,不仅能让其他单测运行下去,也使得调试的人了解错误的具体原因。测试结果最好是,例如判断是否质数,测试结果最好同时给出预期和实际的结果,并且能够继续运行更多的测试。触发测试并失败的程序员可能不熟悉失败的代码。现在花时间来写清楚错误消息,总比实际测试中出现问题却不知道原因要好。

有一个观点是:测试框架倾向于开发一个自己的迷你语言,当然了,它有条件、控制、打印机制。Go已经拥有所有这些能力,为什么要重新创造一个专门给测试的语言?我们宁愿在Go上写测试,这样不用多学一门语言,而且这种方法更加直接和易于理解。

如果编写良好(清晰)错误信息所需的额外代码,似乎是重复的和并却工作量巨大。那么则表驱动测试可能会更好地工作,在一个数据结构(struct)中定义的一堆输入和输出列表(Go具有对数据结构文字的优异支持)然后遍历迭代。编写良好测试和良好错误消息的工作将在许多测试用例上进行摊销。标准Go库中的fmt包下有很多说明性示例。

Runtime运行时是怎么实现的?

还是因为由于启动bootstrap问题,运行时(runtime)代码最初主要是用 C 编写的(带有一点汇编程序),但后来被翻译成 Go(除了一些汇编程序)。 Gccgo 的运行时支持使用 glibc。 gccgo 编译器使用了名为分段堆栈的技术来实现 goroutines,此技术得以与最近对黄金链接器(gold linker)的升级。 Gollvm 同样建立在相应的 LLVM 基础架构上。