点击此处---> 群内免费提供SAP练习系统(在群公告中)
加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)
如我最近的博客文章,我第一次涉足ABAP单元测试,这要归功于 Jacques Nomssi Nzali , Mike Pokraka 和其他几个 其他人,我已经学到了很多东西,并且一切都很好。
我现在确实有一个未解决的问题,而不是将其隐藏在我的博客文章的评论中,我决定为其启动一个新的问答线程。 目前,我使用Z表来查看是否允许特定用户执行某些操作,并且此操作应按预期进行,并且我还通过模拟表访问获得了合适的测试用例。 因为我仍处于沙盒系统的原型模式下,所以这是实现它的最简单方法,并且比我要替换的代码中的硬编码检查要好。
在将代码移至实际开发系统时,我想将此逻辑切换为适当的授权对象,并检查是否允许用户执行操作。 因此,我的问题是:然后如何在单元测试期间"模拟"权限检查?
我已经在寻找答案,但是即使在此过程中我发现了其他有趣的文章(即 ABAP单位最佳做法 with-abap-unit-tests/" target =" _ blank">使用ABAP单元测试),没有一个包含我特定问题的答案。 那么,有没有一种可以在NW 7.50系统中工作并且不太需要实施呢? 例如,我可以想象按照另一种接口定义(一种用于auth而不是表选择)进行操作,但是不确定这是否是最佳选择。
非常感谢和欢呼
Baerbel
好的,让我们从一个简单的示例开始。
首先,我需要一个接口
我有真实的类来测试授权
但是我也有一个用于相同接口的Mock
模拟方法还包含全局变量RESULT_TCODE。 这个变量只包含我应该收到的结果。
mock方法还需要一种方法来填充此变量。
您现在需要将该类注入最终的类中。
因此,我在最后一堂课的构造函数中有一个可选属性。 此构造函数确定参数是否未绑定来创建真实的参数。
(在纯净代码中,您将需要一个Factory,但会使代码有些复杂)
现在在您的测试类中,您需要创建一个 MOCK,然后使用构造函数进行注入。
所以这里有点复杂
O_Authorization包含一个与我最终类的构造函数所期望的接口相对应的类型。
O_Authorization_Mock包含实际的模拟类,并有可能推送预期的结果
Sandra Rossi
嗨,Sandra-很抱歉,但是您的回应 对我而言,太晦涩难懂了,因为到目前为止,我还只是涉足ABAP OO和单元测试的表面。
您描述了单元测试的全部内容。 用更通用的术语来说:组件A(您的应用程序)取决于组件B(权限检查)。 如果依赖组件(DOC)尚不可用,则可以对其进行模拟或存根,或开发临时解决方案(Z-Table)。 并行或增量开发的好方法!
如果单元测试对DOC进行了抽象,则理想情况下应该能够在不更改任何测试或高级产品代码的情况下切换DOC。 这就是使良好的单元测试成为安全网的原因。
您正面临一个问题,这可能表明您的测试水平可能太低,这是普遍的趋势,并且也是其中之一。 使单元测试变得比原来更麻烦的事情。 因此,通常应避免测试私有方法,这是一个很好的理由。
因此,在您的情况下,我会在一个方法或类中添加auth检查(如Sandra的答案所示),并且您的单元测试会对此进行模拟 。 产品代码最初会查找Z表,但随后会执行身份验证检查。 只要方法/类的接口保持不变,并且您的单元测试模拟该接口,那么在更改基础功能时就不需要对测试进行任何更改。 在这里,我们看到了单元测试的真正好处!
在上面的示例中,CHECK将在生产代码中执行AUTHORITY-CHECK,或者在测试中执行两次测试。
您可以模拟任何东西:
包装要模拟的方法中的代码,最终根据您的情况将方法放在专用类中(ZCL_AUTH_CHECKER)
创建测试 double(类),它将"重新定义" CHECK方法以返回您首次注入的结果。 在您的情况下,您可以注入一个内部假授权(对象,字段,值)表,然后重新定义的CHECK会读取内部表。
在测试类中,您将测试双精度注入ZCL_AUTH_CHECKER, 您注入了伪造的授权,然后调用了受测代码。
更新:
感谢 Sandra Rossi , Mike Pokraka 和弗雷德里克·吉罗德(Frederic Girod)我继续并为该类实现了附加的类和接口 auth检查,但是按照我已经必须要做的 表选择可测试的(仅来自本地测试类的代码段):
测试方法本身保持不变。 我确实有一些错误 同时添加身份验证检查逻辑并定期重新运行测试。 最初,我错过了必须(后见之明!)定义和 在测试类中实现auth-check接口,从而导致 运行测试时的技术问题。 弄清楚之后, 我确实没有通过其中一项测试的实际失败,直到我意识到自己 还必须为Z表的内部模型提供测试数据 验证检查逻辑(auth-> zbc_ddic_check)。
感谢您的帮助!
Frederic Girod a>
嗨,弗雷德,
我正在用单元测试实际检查的类是ZCL_CHECK_WB_ACTION。 它确实是通过接口通过表选择的,所以-就目前而言-我是否认为通过其他方法也通过同一接口来处理auth检查并不重要。 一旦将代码从沙箱移至实际的开发系统,就必须更改部分代码,例如,例如,目前我尚未定义正确的错误消息,并且某些对象名称也可能会更改。 截至目前,我的代码中有很多" TODO"伪注释,不会忘记我需要调整的所有内容。
我的工作期限很短,可以这么说,因为我正在开发的沙盒系统将在下周中期"重置",所以我试图不让 完美是商品的敌人,同时仍然可以从原型中获取有价值的信息。
干杯
Bärbel
谢谢,迈克!
您会很高兴地读到,即使我也从针对私有方法的单元测试开始,但最终我终于摆脱了所有这些方法,现在仅对带有测试的公共方法进行了单元测试。 覆盖率100%。
欢呼声
贝尔贝尔
一周热门 更多>