Srs

SRS单元测试、覆盖率和自动回归怎么做

2021-03-05  本文已影响0人  winlinvip

SRS支持了单元测试、覆盖率分析、自动回归测试。每次提交,每个PullRequest,每次合并,都会触发测试。

这是这么些年一直想做,却一直没时间做的事,是极其重要的事情。

为什么?我们看WebRTC真正的大佬怎么说:

WebRTC PC 最大的一个挑战就是它包含了太多的能力,
。。。,可以发现对它的覆盖率远远不够,即使我们不要求完整覆盖,
而只考虑 “可接受” 的覆盖率,也非常的困难。

我在 RTC 领域中,碰到的最大的挑战之一,就是海量的测试用例。。。
即使要达到 95% 的覆盖也是非常的有挑战的。当然完整的测试非常有帮助,
我们当然也要考虑完整覆盖带来的巨大挑战,真的非常的难。

Bernard Aboba, W3C WebRTC Chair, WebRTC 的现状和未来

目前比较好的开源项目,都会有单元测试和覆盖率,但还比较少有场景化的回归测试,自动回归测试就更少了。RTC由于场景的复杂性,自动回归测试就更加难做了。解释下这几个东西:

得益于pion/webrtc,Go实现了完整的WebRTC协议栈,我们很方便使用pion做回归测试。如下图:

CircleCI上,可以看到详细的测试过程,如下图:

CodeCov上,可以看到SRS代码的详细覆盖率,如下图:

如果你是SRS开发者,修改完代码后,也可以手动本机跑UTest,覆盖率,回归测试,下面介绍使用。

Note: 还可以做压力测试,压测工具的使用,参考srs-bench

Coverage

修改代码后,可以本机快速跑UTest和Coverage,只需要执行几个命令就可以跑起来。

如果是macOS,执行下面的命令:

cd ~/git/srs/trunk &&
./configure --osx --gcov=on --utest=on &&
bash auto/fast.sh

如果是Linux,执行下面的命令:

cd ~/git/srs/trunk &&
./configure --gcov=on --utest=on && 
bash auto/fast.sh

也可以用gcovr生成结果:

cd ~/git/srs/trunk &&
./configure --gcov=on --utest=on && 
make && ./objs/srs_utest &&
gcovr -r src --html --html-details -o ./objs/coverage/srs.html objs/src

如何安装gcovr请参考安装GCOVR

最终生成文件objs/coverage/srs.html,可以在Chrome打开:

如果只关注某个模块的覆盖,比如kernelprotocol模块,可以直接跑两个模块的覆盖率:

bash auto/fast.sh kernel protocol

下面是手动跑回归测试。

Regression Test

修改代码后,也可以本机跑回归测试。最新的更新请移步SB: Regression

回归测试需要先启动SRS,支持WebRTC推拉流:

if [[ ! -z $(ifconfig en0 inet| grep 'inet '|awk '{print $2}') ]]; then 
  docker run -p 1935:1935 -p 8080:8080 -p 1985:1985 -p 8000:8000/udp \
      --rm --env CANDIDATE=$(ifconfig en0 inet| grep 'inet '|awk '{print $2}')\
      registry.cn-hangzhou.aliyuncs.com/ossrs/srs:v4.0.76 objs/srs -c conf/rtc.conf
fi

然后运行回归测试用例,如果只跑一次,可以直接运行:

go test ./srs -mod=vendor -v

也可以用make编译出重复使用的二进制:

make test && ./objs/srs_test -test.v

运行结果如下:

$ make test && ./objs/srs_test -test.v
=== RUN   TestRTCServerVersion
--- PASS: TestRTCServerVersion (0.00s)
=== RUN   TestRTCServerPublishPlay
--- PASS: TestRTCServerPublishPlay (1.28s)
PASS

可以给回归测试传参数,这样可以测试不同的序列,比如:

go test ./srs -mod=vendor -v -srs-server=127.0.0.1
# Or
make test && ./objs/srs_test -test.v -srs-server=127.0.0.1

支持的参数如下:

其他不常用参数:

上一篇 下一篇

猜你喜欢

热点阅读