加密/解密的单元测试

 seoer 发布于 2023-01-08 00:48

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

我正在尝试为该方法编写一些测试。我已经考虑过测试,加密和解密方法彼此相反,但这并不能单独说明它们。我想按原样使用这些方法来获取一组输入输出,并将其设置为测试(我知道这不是理想的方法,但是这些测试的目的是为了确保该函数在将来能够像它那样运行今天,不是说加密/解密就不错了)。

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

有任何想法吗?

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);
    }
    

    也许添加更多测试以检查尝试加密/解密无效值会引发异常和其他错误情况。

    2023-01-08 01:12 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有