C#+ NUnit:带有字节数组参数的单元测试方法

kol*_*kol 2 c# hex nunit unit-testing bytearray

我想使用具有字节数组参数的方法为某些类编写单元测试。总共大约有100种方法,数组大小从5-10到几百个字节。我应该如何生成和存储测试阵列?

  1. 我应该手动生成它们还是通过某些生成器代码(也应该进行单元测试)生成它们?
  2. 我应该在测试期间在内存中生成它们,还是应该提前生成它们并将它们存储在某个地方?
  3. 在后一种情况下,我应该将它们存储在文件中(即使单元测试不应该涉及文件系统),还是应该将它们存储在测试代码本身中(例如,以十六进制格式的字符串存储,例如:“ 47 08 00 14等”)?

我开始手动创建它们,并将它们存储在测试代码中的十六进制字符串中。我使用这样的二进制字符串做了很多工作,因此我可以相对轻松地读取它们(“我什至看不到代码。我所看到的只是金发,黑发,红发。”)问题是,这种方法很慢,而且我认为使用自动生成器将导致更易于维护的测试。但是,我应该如何测试发电机的输出是否正确?听起来像Catch-22 ...

CRi*_*ice 5

我假设您希望字节实际代表可反序列化的对象,而不仅仅是随机的。一百个字节左右将构成一个小的base64编码的字符串。您可以将测试输入保存为以64为基数的字符串,然后测试可以获取正确的输入并将其转换为字节:

    const string someScenario = 
"R0lGODlhAQABAIAAAAAAAAAAACH5BAAAAAAALAAAAAABAAEAAAICTAEAOw==";

    byte[] bytes = Convert.FromBase64String(someScenario);
Run Code Online (Sandbox Code Playgroud)

您可以通过序列化程序预先确定字符串是什么,例如

public string SerializeAsBase64()
{
    var session = new SessionCredentials { SessionKey = Guid.NewGuid() };

    using (var mem = new MemoryStream())
    {
        var formatter = new BinaryFormatter();
        formatter.Serialize(mem, session);

        var bytes = mem.ToArray();

        return Convert.ToBase64String(bytes);
    }
}
Run Code Online (Sandbox Code Playgroud)

为确保其正常工作,您是否也有解串器...?序列化然后反序列化然后比较原件是否相等?


eas*_*der 1


我会建议几种方法,但不确定哪种方法适合您,甚至可能适合您,因为没有针对您的情况的方法示例。
如果您可以提供您的方法的示例并解释其工作原理,它将很有用。你这 100 种奇怪的方法有什么作用?

1)尝试将 100 个奇数方法中与字节数组一起使用的逻辑重构并提取为几个辅助方法。这样,辅助方法就可以处理字节数组,然后将反序列化的对象传递给 100 个奇怪的方法,这些方法现在将开始使用对象进行处理。

或者

2)就我个人而言,我更喜欢在代码中将字节数组放在测试方法旁边,这是您当前采用的方法。也许一些输入组合作为函数的属性(使用 NUnit RowTest 扩展)。这使得单元测试相对独立于其他测试。如果更改参数,则只有特定的单元测试会受到影响。
生成器的最大问题是,为 100 个奇数方法中的每一个返回字节数组的逻辑可能会变得非常复杂。对生成器的更改可能会影响您的所有单元测试。

单元测试应该易于维护且独立。通过引入生成器,您将添加依赖项并增加复杂性。

干杯!