vpp的测试框架是在unittest的基础上编写的。只是重写unittest的一些类,然后测试用例在继承 测试框架类。
framework.py
这个是测试框架类,主要包含 所有测试用例都要继承的类VppTestCase,setUpClass、
setUp、tearDownClass tearDown等方法和 一些 对VPP操作比如 发包创建流等等
VppTestCase
继承了 unittest的 TestCase。之后编写的测试用例类都是继承自他
在原有的 TestCase的基础上做了哪些增加:
之后所有的测试用例中 等等需要对unittest方法重写的都进行了重写。
测试用例写的时候就写少部分,大部分共有的都抽出来放到 VppTestCase中
都是对VPP功能的操作。
setUpClass
在运行testcase之前执行类设置
删除共享内存文件,启动vpp并连接vpp -api
创建临时文件夹存储日志
配置VPP根据设置的系统参数进行运行
连接 vpp-api
setUp
每个测试用例执行前清除之前测试执行VPP产生的东西
清理环境
tearDownClass
输出到日志文件
VppTestRunner
VppTestRunner继承自 unittest.TextTestRunner类
属性 resultclass 用于返回测试结果 VppTestResult
调用了父类 TextTestRunner的构造方法
run
一个套件将测试用例添加进去。
这个就是执行加入测试套件里的测试用例
super(VppTestRunner, self).run(filtered)
然后 run_test执行传入参数 suite
简单分析下测试用例
test_ping.py
配置执行测试用例前的配置等,先调用VppTestCase类的 setUpClass方法。再创建两个接口,启动,配置
对接口开启捕获,开始包生成器,创建 ping命令
获取包的信息 断言判断是否包的信息与预期的符合
pg_enable_capture 等方法是从框架模块 framework中的 VppTestCase类中的
之后删除之前的配置恢复环境
test_ip4.py
同样是先进行配置
test_fib
大致流程都是如上
创建流,包,添加到接口。启用捕获,发包,验证包的信息
create_stream
创建流的方法 就在 test_ip4里面
创建一个 报文 源目的 数据等
在接口开启捕获
self.pg_enable_capture(self.pg_interfaces)
self.pg_start()
然后获取包,
获取数据包并验证
pkts = self.pg0.get_capture()
self.verify_capture(self.pg0, pkts)
验证方法也在 test_ip4中
test_1_add_routes及 VPP-API流程
增加100个路由
配置路由进去
config_fib_many_to_one方法里面是使用的 vpp-api来操作
self.vapi.ip_add_del_route(
dest_addr, dest_addr_len, next_hop_address)
在 框架中 framework 中
cls.vapi = VppPapiProvider(cls.shm_prefix, cls.shm_prefix, cls)
而 VppPapiProvider 是从 vpp_papi_provider 导入
这个是提供 vpp-api的
其中导入了 vpp-api模块
一些对 vpp-api的使用可以查看 vpp_papi_provider
调用的方法 ip_add_del_route 在 vpp_papi_provider中
封装了很多方法
如何编写一个新的测试用例
增加的测试用例要以 test_开头才可以,且里面的类要继承 VppTestCase
默认参考文档写的测试用例只能使用 make test /retest等部分或者全部运行才能一起运行
要让其测试用例可以单独执行,可以增加
导入 unittest
from framework import VppTestCase, VppTestRunner
然后在下面
if __name__ == '__main__':
unittest.main(testRunner=VppTestRunner)
既可使用 make test-shell命令进行单独执行或者直接执行
具体编写主要参考测试用例编写文档
https://docs.fd.io/vpp/17.04/vpp_make_test/html/overview.html#example-how-to-add-a-new-test
而且所有的测试用例都可以按照 unittest的方法执行,
测试用例的执行需要很多环境变量需要去Makefile文件中查看。make 参数命令可以,不使用的话就要自己去配置环境变量。