gpt4 book ai didi

c# - 测试大型状态机有哪些策略?

转载 作者:IT王子 更新时间:2023-10-29 04:38:52 28 4
gpt4 key购买 nike

我继承了一个庞大且相当复杂的状态机。它有 31 种可能的状态,都是真正需要的(大业务流程)。它具有以下输入:

  • 枚举:当前状态(所以 0 -> 30)
  • 枚举:来源(目前只有 2 个条目)
  • bool :请求
  • bool :类型
  • 枚举:状态(3 个状态)
  • 枚举:处理(3 个状态)
  • bool 值:已完成

将其分解为单独的状态机似乎不可行,因为每个状态都是不同的。我为最常见的输入编写了测试,每个输入一个测试,所有输入都是常量,状态除外。

[Subject("Application Process States")]
public class When_state_is_meeting2Requested : AppProcessBase
{
Establish context = () =>
{
//Setup....
};

Because of = () => process.Load(jas, vac);

It Current_node_should_be_meeting2Requested = () => process.CurrentNode.ShouldBeOfType<meetingRequestedNode>();
It Can_move_to_clientDeclined = () => Check(process, process.clientDeclined);
It Can_move_to_meeting1Arranged = () => Check(process, process.meeting1Arranged);
It Can_move_to_meeting2Arranged = () => Check(process, process.meeting2Arranged);
It Can_move_to_Reject = () => Check(process, process.Reject);
It Cannot_move_to_any_other_state = () => AllOthersFalse(process);
}

没有人完全确定每个状态和输入集的输出应该是什么。我已经开始为它编写测试。但是,我需要编写类似 4320 的测试 (30 * 2 * 2 * 2 * 3 * 3 * 2)。

您对测试状态机有什么建议?


编辑:我正在研究所有的建议,当我找到最有效的建议时会标记答案。

最佳答案

我看到了问题,但我肯定会尝试拆分逻辑。

在我看来最大的问题是:

  • It has 31 possible states to be in.
  • It has the following inputs:
    • Enum: Current State (so 0 -> 30)
    • Enum: source (currently only 2 entries)
    • Boolean: Request
    • Boolean: type
    • Enum: Status (3 states)
    • Enum: Handling (3 states)
    • Boolean: Completed

发生的事情太多了。输入使代码难以测试。您已经说过将其拆分为更易于管理的区域会很痛苦,但在进行中测试这么多逻辑同样令人痛苦。在您的情况下,每个单元测试涵盖的范围太多

question I asked about testing large methods本质上是相似的,我发现我的单位太大了。您仍然会进行许多测试,但它们会更小且更易于管理,覆盖范围更小。不过,这只能是一件好事。

测试遗留代码

查看 Pex .你声称你继承了这段代码,所以这实际上不是测试驱动开发。您只是希望单元测试涵盖每个方面。这是一件好事,因为任何进一步的工作都将得到验证。我个人还没有正确使用 Pex,但是我看到的视频让我惊叹不已。本质上,它将根据输入生成单元测试,在这种情况下,输入是有限状态机本身。它将生成您不会想到的测试用例。当然这不是 TDD,但在这种情况下,测试遗留代码应该是理想的。

一旦您获得了测试覆盖率,您就可以开始重构,或者在良好的测试覆盖率安全的情况下添加新功能,以确保您不会破坏任何现有功能。

关于c# - 测试大型状态机有哪些策略?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2691073/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com