ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

110、ABAP测试隔离(Test Double)

110、ABAP测试隔离(Test Double) 110、ABAP测试隔离(Test Double)那是一个周五的深夜,生产系统报出来一个诡异的订单重复过账问题。我拉出程序日志,发现罪魁祸首是一个BAPI调用,在单元测试里明明验证过所有分支,结果一上集成环境就翻车。后来排查了很久,发现问题是出在测试里直接用了真实的数据库表读取——测试跑的时候数据是干净的,但生产环境里那张表里恰好有一行历史脏数据,把程序逻辑带偏了。从那以后,我给自己定了个规矩:凡是写单元测试,绝对不碰真实数据库、不碰真实RFC、不碰真实外部服务。这就是ABAP里Test Double存在的意义。很多人第一次听到Test Double这个词,觉得是某种高深莫测的框架。其实它就是个替身演员。你在测试里需要某个依赖对象,但你又不想让这个依赖对象发挥真实作用,于是你造一个假的替身来顶替它。ABAP里最常见的Test Double就是三种:Stub、Mock、Fake。有人会把它们混为一谈,但用起来差别还挺大。Stub是那种你给它固定输入就返回固定输出的假对象,它不关心你调了多少次,也不验证调用参数,纯粹为了把被测代码喂饱。Mock则更贼一点,它会记录调用行为,测试结束时可以断言“这个方法有没有被调用过”“传进来的参数对不对”。Fake是那种实现了一个简化版本的真实逻辑,比如内存表代替数据库表,行为上很像真的,但底层不是真实持久化存储。在ABAP开发环境里,官方推荐的做法是使用IF_OSQL_TEST_DOUBLE这个接口来做数据库访问的隔离。这玩意儿怎么用呢?说白了就是把OPEN SQL的读操作拦截下来,替换成你预先准备好的数据。我见过不少同事写测试,直接往测试数据库里INSERT数据,再调用程序去查,然后测试完再DELETE。这种写法
返回列表