大的小的都一样啊,正常都是拿成熟的测试框架直接用啊。
unittest 是非常成熟的,稍微新点儿的语言都直接自带了,老点儿的也都有主流的包。比如你说的 go 就不算老,直接就能 go test。像 python、ruby 这类脚本语言就算老,加个测试也就一个官方包而已。js 的话,jest 是占主导地位的,还有 mocha 也比较流行。
理论也很简单,就是保证每个单元都能单独正常工作,出 bug 就在相关测试里加 case。设计上就是分层,尽量相对独立,可以单独测试。不同层之间 interface 尽量稳定,必要时按照接口 mock 其它层,这样尽量保证每一层的功能稳定。很多静态语言的框架里,有时甚至专门套一层,就是为了方便 mocking,然后就搞成了俄罗斯套娃。
测试有一些主流的标准,然后以单独的包形式提供扩展功能。比如想用 jenkins,一般是加个 junit report,然后设置去哪找测试生成的 junit xml 文件就可以了。jest 只是一个基本测试框架,想用 bdd 的话就加个 jest-cucumber;同理再加个 jest-puppeteer 就可以用 bdd 的形式跑 e2e 的 puppeteer。e2e 的 web 测试框架非常多,也非常成熟,老一点儿的有 selenium/webdriverio 基本上啥语言都有封装,不那么老的比如 cypress 也挺流行,新一点的 puppeteer/playwright 能做的都不止测试了。我直接用 playwright 爬网页,而且它自己还有个跟 jest 接口类似的测试框架,还能直接 mock request。放以前不但得搞个 mock 用的 web service 模拟第三方 api(虽然其实也就几个静态 json 而已),还得改代码测试的时候指向自己的服务。
按照现在的主流 web ui 框架,比如 react、vue 之类,组件化的设计可以单独测试,比较流行的有 storybook。但是都对组件的组织形式有相当高的要求,不然需要 mock 的东西太多,就很难持续进行下去了。
而开发也有 tdd,先把测试写好,这样基本的工作单元和接口都已经设计好了。然后再按照测试写代码,自然跑通,而且 coverage 直接就100%。这也是为啥 pure function 最适合写 unittest,每个函数都可以单独测,跑通了就一劳永逸。
另外,liquibase 不是测试用的,而是专门做 db migration 的工具。我们之前 rails 里写的 migration 只管跑 sql,之后什么状态完全不管。liquibase 对于一般的东西会做个状态认证,比如 foreign key 加不成就挂掉,而 stored procedure 也是手动加了一行代码(当然是自动生成的)看一下状态,不正常就直接挂掉。
【 在 xunery (寻) 的大作中提到: 】
: 感谢这么大篇幅的回复
: 但是不同类型的软件可能测试方法天差地别。对于一个小团队来说,如果想实施自动化测试的话是不是只能依赖现成的测试框架,就是想问问大家有什么好的方法或测试框架。
: 每个模块暴露的接口都要写各种测试case吗?那些不向外暴露接口的模块怎么处理?比方说exe程序。
: ...................
--
FROM 203.211.108.*