【问题标题】:Unit testing of encrypt/decrypt加密/解密的单元测试
【发布时间】:2014-06-23 16:41:39
【问题描述】:

我实现了一个名为Enigma 的非常简单的类,它有一个对称密钥和两个方法:byte[] encryptString(String strToEncrypt)String decryptBytes(byte[] arrayToDecrypt)

我正在尝试为这些方法编写一些测试。我曾想过测试加密和解密方法是否相互相反,但这对它们中的每一个都没有任何说明。我想像现在一样使用这些方法来获得一组输入输出并将其设置为测试(我知道这并不理想,但这些测试的目的是保证函数在未来的行为今天确实如此,并不是说加密/解密是)。

但是,我不知道如何获取byte[] encryptString(String strToEncrypt) 输出的字节数组的表示,以便在测试类中对其进行硬编码。

有什么想法吗?

【问题讨论】:

    标签: java unit-testing junit bytearray junit4


    【解决方案1】:

    关于如何测试这个的一些注意事项(个人意见警告:-))

    • 如果您正在编写单元测试,请避免从文件中读取预期结果,因为它会减慢测试速度(单元测试必须非常快),并且还会创建与您的代码无关的另一个可能出错的内容(即该文件可能会被删除等)
    • 不要使用您正在测试的相同方法来创建用于检查该方法的预期结果。如果您尝试检查算法,这是没有意义的,并且可能会使算法中的错误永久存在
    • 考虑到 Java 中最小的工作单元是一个类,而不是一个方法(暂时忘记 Java 8 的 lambda 表达式,您不会真正直接为它们编写单元测试),因此,您应该尝试测试类,而不是方法

    我的最后一点让我(终于?)提出建议。想想类的职责是什么(希望是单一职责,请参阅SRP)。在这种情况下,我相信您的班级的职责是对字符串进行双向加密。
    因此,我会编写以下测试:

    @Test
    public void testThatEncryptingStringResultsInExpectedBytes() {
        byte[] encryption = enigma.encryptString(TEST_STRING);
    
        assertArrayEquals(EXPECTED_ENCRYPTION, encryption);
    }
    
    @Test
    public void testThatDecryptinEncryptionResultsInOriginalString() {
        String decryption = enigma.decryptBytes(TEST_ENCRYPTION);
    
        assertEquals(EXPECTED_ORIGINAL_STRING, decryption);
    }
    
    @Test
    public void testThatDecriptionReversesEncryption() {
        String decryption = enigma.decryptBytes(enigma.encryptString(TEST_STRING));
    
        assertEquals(TEST_STRING, decryption);
    }
    
    @Test
    public void testThatEncryptionReversesDecryption() {
        byte[] encryption = enigma.encriptString(enigma.decryptBytes(TEST_ENCRYPTION));
    
        assertEquals(TEST_ENCRYPTION, encryption);
    }
    

    可能会添加更多测试来检查尝试加密/解密无效值是否会引发异常和其他错误情况。

    【讨论】:

    • 谢谢,我终于做到了(使用在线加密工具得到十六进制的结果)。
    • 评论和问题:不确定是否可以将逆向测试应用于每种加密(猜测仅对对称算法有意义)。我同意读取文件会减慢单元测试的速度,这应该是闪电般的速度。在使用 JUnit 测试 xml 生成时,您将如何解决它?有什么提示或例子吗?
    • 首先,让我强调一下,在单元测试期间读取文件比速度慢(尽管是一个大问题)更大的问题是不一致、失去可重复性和失去隔离性。读取文件取决于 I/O,这意味着它可能会失败,每次运行可能需要不同的时间等等。在测试期间执行 I/O 操作会阻止它成为单元测试。关于 XML 生成,定义您的生成器以接收输出写入器/流作为构造函数/方法的参数或通过注入。单元测试将提供一个模拟输出缓冲区。
    • 对不起,简短的回答,评论中的字符数有限制。如果您需要更好的答案,请发布问题,我会及时回复。
    • 我也遇到了同样的问题,但是问题是我的加密器使用的是随机盐,所以不能期望加密值。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-28
    • 1970-01-01
    • 1970-01-01
    • 2013-05-05
    • 2018-02-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多