云服务器价格_云数据库_云主机【优惠】最新活动-搜集站云资讯

香港服务器_阿里云子账号登陆_返利

小七 141 0

嗨,社区,

不久前,我发布了一个名为模型加载程序的工具。简单地说,它允许在excel中准备大量的测试数据,然后方便地将其提供给被测代码,而无需将这些值硬编码到单元测试源中。有关更多详细信息,请参阅我以前关于此主题的文章:

abap单元测试模型加载程序如何用zmockup\u loader进行方便的多用例测试

本文介绍了我们将mockup loader与数据访问器模式方法结合使用的经验

需要访问数据库内部的代码对于单元测试来说有点复杂。实现这一点的方法之一(如果从一开始就设计得很好的话)就是所谓的数据访问器模式。

其思想是将选择从处理代码中分离出来,并将它们抽象到一个单独的接口后面。处理类不读取数据库本身,而是调用实例化期间传递给它的数据访问器实例。接口的实现可能因环境(prod/test)或某些其他情况而异。例如(伪代码):

这个设计创造了一个机会来实现自己的与测试相关的访问器类,它将向DB提供测试模拟而不是选择。app类将不知道。

模型加载程序有2个工具来单元测试"db相关"代码。一个是"存储/检索",这在上面的第一篇文章中有描述。但是,它需要在"生产"代码中编写一些与测试相关的代码,这并不理想(尽管如果程序从一开始就没有正确设计,这是一种更简单的方法)。第二种方法是接口存根,最近引入到模型加载程序中,如下所述。

显然,每个单元测试都可以实现上述接口,并用zmockup\u加载程序调用替换select。我发现这个代码在大多数情况下是非常相似和重复的。那么为什么不让它更方便、更自动化呢。这里是最终的解决方案:

所以这里发生的事情:

如果您有多个数据集用于测试相同的代码,您可能需要创建多个存根…或者您可以使用在模型加载程序中实现的过滤解决方案。假设您有一个表mock,它有如下记录:

…其中DOCNR表示一个测试用例(这一思想在前面的第二篇文章中也有描述)。因此,您可能希望在调用相同代码并检查结果的测试用例上构建一个循环。顺便说一下,测试用例也可以是一个单独的模拟表。以下是如何在一个存根中实现这个任务。

注意connect方法的两个可选参数:i\u sift\u param和i\u mock\u tab\u key。第一个是指接口方法中真正的"importing"参数的名称,第二个是模拟表中的key字段。因此,在上面的示例中,模型加载程序将获取与I\u DOCNR参数一起传递的实际值,并仅过滤那些DOCNR=I\u DOCNR的测试数据表行。一个存根–多个测试。

注意:只支持一个过滤参数–这在某种程度上是一种简化–但是对于单元测试来说,它应该足够了(至少在我们的经验中是这样)。

我还没有提到如何从接口方法返回数据。实际上,它可以返回、更改或导出参数。默认情况下,存根代码假定数据"正在返回"。可以这样重写:

考虑i_output_param参数。它是指要将模拟数据放入其中的参数的名称。可以导出、更改或返回参数。默认情况下(如果为空或未给定),存根查找返回的参数并使用它。

我希望您会发现该工具对您的单元测试有用。并非总是需要大量的测试数据来准备和检查。但当它是如此的样机装载机证明非常有用,至少对我们的团队。与硬编码相比,在Excel中准备测试用例数据是一种魅力(我们认为ecatt似乎不太方便)。

代码是开源的,可以在这个github存储库中找到。

最好的安装方法是abapGit–这是一个了不起的开发人员工具,如果你还没有尝试过的话,你真的应该。

在接下来的文章中:在系统和sap模型编辑中将一批优秀产品方便地转换成模型。请继续关注。

Stuber的初始版本使用了test double framework(TDF,见下文),这似乎是最近很流行的(尽管我发现很不直观,它需要在配置之后调用这个方法…imho)。但是,返利手游,TDF在7.4下不受支持,我们的一些客户机仍然存在,因此我创建了一个"本机"存根。它使用'generate subroutine pool'来创建动态实现给定接口的类。为了最小化动态编码,在zcl\u mockup\u loader\u stub\u基类中实现了一些公共代码,然后在动态基类中继承这些代码。所有的接口方法都是实现的——那些没有通过connect\u方法"连接"的接口方法只会有空的实现。这里有一个有趣的事实…

最初,我想将动态实现定义为"for testing"类。事实上,这是只测试的代码,还可以为接口使用"partially implemented"关键字。但没有成功。动态代码将成功生成,但创建类的尝试将失败,并显示"class\PROG=%…\class=LCL\u STUB不存在"。经过几个小时或不成功的尝试,我终于意识到"for testing"类不能动态引用。我在这里提到它是为了对某人有用。我在网上找不到任何话题(虽然搜索不太努力)。直观的解释是,测试代码对程序来说是一种"元"代码,它可能以不同的方式存储。但是,物联网学什么,如果谁能在评论中留下适当的澄清,云服务器买,那就太好了。