加密/解密的单元测试

时间:2014-06-23 16:41:40

标签: java unit-testing junit bytearray junit4

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

我正在尝试为这些方法编写一些测试。我曾考虑过测试加密和解密方法是彼此相反的,但是它们并没有单独说明每一个。我想现在使用这些方法来获取一组输入 - 输出并将其设置为测试(我知道这不是理想的,但这些测试的目的是保证函数在将来的行为表现如此今天,不是加密/解密)。

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

有什么想法吗?

1 个答案:

答案 0 :(得分:4)

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

  • 如果您正在编写单元测试,请避免从文件中读取预期结果,因为它会降低测试速度(单元测试必须超快),以及创建与您的代码无关的另一个可能出错的东西(即该文件可能会被删除等。)
  • 不要使用您正在测试的相同方法来创建用于检查方法的预期结果。如果你试图检查算法,这可能是毫无意义的,并且可能会使算法中的错误永久化
  • 考虑一下这样一个事实,即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);
}

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