为包含 IO 变量的 FB 编写测试

问题描述 投票:0回答:1

正如标题所示,我想知道如何测试在功能块本身内部声明了 IO 变量的 FB。我正在使用 TcUnit 为我制作的运动库编写测试。现在我看到的唯一解决方案是从测试块内创建输出并将其链接到我无法从外部写入的测试 FB 的输入。另一种选择是使用指针,但我真的不喜欢它,尽管这可能是唯一“正确”的方法。

使用IO链接的解决方案

节目:

PROGRAM INTERNAL PRG_TESTS
VAR
    fbTest  : FB_Test;
END_VAR

测试FB:

FUNCTION_BLOCK FB_Test EXTENDS FB_TestSuite
VAR
    CantBeModifiedInput AT %I* : WORD;
    HackToModifyTheInput AT %Q* : WORD;
END_VAR

TestMethod();

测试方法:

METHOD TestMethod

TEST('test');
HackToModifyTheInput := 10;

AssertTrue(CantBeModifiedInput = 10, 'Exepected value to be 10.');
TEST_FINISHED();

然而,这使得只能运行手动测试,这不能在构建服务器上自动完成 - 或者可以吗?我还没有到自动化测试的阶段,但这是未来需要考虑的事情。

使用直接内存访问的解决方案:

METHOD TestMethod
VAR
    testWord    : WORD := 10;
END_VAR

//HackToModifyTheInput := 10;
TEST('test');

MEMCPY(
    destAddr := ADR(CantBeModifiedInput), 
    srcAddr := ADR(testWord), 
    n := SIZEOF(WORD));

AssertTrue(CantBeModifiedInput = 10, 'Exepected value to be 10.');
TEST_FINISHED();

我该如何解决这个问题?我真的不想使用 fb 的输入和输出,而不是从块内直接创建 I/O。说实话,我觉得记忆操纵可能是唯一正确的方法。

testing twincat structured-text
1个回答
0
投票

更重要的问题是;你想达到什么目的?

无论您是在本地还是构建服务器上编译测试并不重要。它们仍然需要作为 TwinCAT 任务执行。

从您的示例中并不完全清楚您想要实现的目标是什么。为什么要在测试套件中定义一些

%Q
%I
声明? 您不想测试 TwinCAT I/O 链接(通过
%I
%Q
)是否正常工作。 (希望)这一点已被 Beckhoff 验证。 您想要验证的是您自己的业务逻辑,这不应该需要完整的 I/O 链接来编写测试。 测试必须易于实现,并且应该需要易于编写的功能,而不需要太多的设置。

您提到您正在测试某种形式的运动功能块。如果该运动功能块依赖于某些外部数据(如

%I
),则将其定义为对测试对象的依赖项(通过构造函数或方法注入)。在这种情况下,您可以按照您想要的任何方式操作依赖项(例如通过创建模拟),而不是尝试使用原始指针来修改这些值。

© www.soinside.com 2019 - 2024. All rights reserved.