写代码的时候,谁还没碰上过改完一处功能,结果另一处莫名其妙出问题的情况?为了避免这种“修bug引入新bug”的尴尬,很多开发者都会用单元测试来给自己的代码把关。而说到单元测试,自然就绕不开那些好用的单元测试框架。
Java里的JUnit
如果你是做Java开发的,那大概率听说过JUnit。它几乎是Java世界的标配,尤其在Spring项目里随处可见。写个测试类,加个@Test注解,就能跑起来。
import org.junit.Test;
import static org.junit.Assert.*;
public class CalculatorTest {
@Test
public void should_return_4_when_add_2_and_2() {
Calculator calc = new Calculator();
assertEquals(4, calc.add(2, 2));
}
}
Python中的unittest和pytest
Python自带一个叫unittest的模块,语法上有点像JUnit,适合初学者上手。但更多人喜欢用pytest,因为它更简洁,支持直接用assert断言,不用记一堆方法名。
def test_add():
assert 2 + 2 == 4
就这么几行,装上pytest一跑,清清楚楚。而且插件生态丰富,比如测覆盖率、参数化测试都很方便。
JavaScript的Jest
前端圈子里,Jest特别火,尤其是React项目默认就集成它。写个组件,想看看点击按钮后状态变没变,用Jest配React Testing Library就能模拟操作。
test('adds 1 + 2 to equal 3', () => {
expect(1 + 2).toBe(3);
});
它自带断言、Mock、覆盖率报告,开箱即用,省心。
C#里的NUnit和xUnit
.NET开发者常用NUnit或者xUnit。xUnit现在越来越流行,结构更清晰,生命周期控制也更灵活。比如你只想在某个测试集合前执行一次初始化,xUnit能轻松搞定。
Go语言用testing包
Go比较特别,标准库自带testing包,不需要额外引入框架。写测试文件时以_test.go结尾,跑go test就行。
func TestAdd(t *testing.T) {
result := Add(2, 3)
if result != 5 {
t.Errorf("Expected 5, got %d", result)
}
}
虽然功能简单,但够用,而且和语言本身高度集成。
还有别的吗?
当然有。Ruby有RSpec,PHP有PHPUnit,Swift有XCTest,基本主流语言都有对应的成熟工具。选哪个,往往看团队习惯、项目需求,甚至看公司用什么技术栈。
其实用哪个框架不重要,关键是养成写测试的习惯。就像做饭前洗手,不是为了应付检查,而是让自己吃得安心。代码也一样,测过了,上线才不怕半夜被叫醒。”