簡體   English   中英

Junit測試用例

[英]Junit test case

public static String generateSaltString() {
    SecureRandom random = new SecureRandom();
    byte[] salt = random.generateSeed(12);

    return byteToBase64(salt);
}

想知道如何使用Junit為此方法編寫測試用例。 有什么建議嗎?

首先,新的SecureRandom()可能非常慢,因此您可能希望對其進行緩存。 看看這個答案, 一個了。

我會按如下方式重構你的代碼

public class DoRandomStuff {

private RandomUtil randomUtil;

public DoRandomStuff(RandomUtil randomUtil) {
    this.randomUtil = randomUtil;
}

public String generateSaltString() {
    byte[] salt = randomUtil.generateSeed(12);
    return byteToBase64(salt);
}

public String byteToBase64(byte[] salt) {
    // Do salt generation logic here
    return null;
}

generateSeed看起來像一個實用程序方法調用,因此它可以進入類似於此的RandomUtil類

class RandomUtil {
    private SecureRandom random = new SecureRandom();
    public byte[] generateSeed(int seed) {
        return random.generateSeed(seed);
    }
}

現在,您的DoRandomStuff測試類很容易編寫。 使用像Mockito這樣的測試框架注入一個模擬的randomUtil。 使mockedRandomUtil.generateSeed(int)方法返回固定數字。 您的測試實際上是用於檢查byteToBase64()方法是否正在執行它應該執行的操作。 現在,您的測試用例有一個確定的數字。 您可以將測試類中SecureRandom生成的各種數字作為單獨的測試用例來檢查byteToBase64()結果。 作為一個加號,您的隨機數生成代碼現在與您的base64代碼分離。

希望它有所幫助。

我將測試結果是否為null然后多次調用該方法並比較結果以顯示每個調用返回不同的值。

但請記住:這沒有說明結果隨機性的質量!

@Test
public void testGenerateSaltString() {
    String salt1 = YourClass.generateSaltString();
    String salt2 = YourClass.generateSaltString();
    String salt3 = YourClass.generateSaltString();
    String salt4 = YourClass.generateSaltString();

    assertNotNull(salt1);
    assertNotNull(salt2);
    assertNotNull(salt3);
    assertNotNull(salt4);

    assertNotEqual(salt1, salt2);
    assertNotEqual(salt1, salt3);
    assertNotEqual(salt1, salt4);

    assertNotEqual(salt2, salt3);
    assertNotEqual(salt2, salt4);

    assertNotEqual(salt3, salt4);
}

考慮到GaborSch的注釋,我想到了測試的一些模糊實現,因為它可能 - 盡管不太可能 - 兩次調用函數將產生相同的鹽:

@Test
public void testGenerateSaltString() {
    String salt1;
    String salt2;
    int differenceCount = 0;

    for(int i = 0; i < 1000; i++ ) {
        String salt1 = YourClass.generateSaltString();
        String salt2 = YourClass.generateSaltString();

        // null is still inacceptable
        assertNotNull(salt1);
        assertNotNull(salt2);

        if(!salt1.equalsIgnoreCase(salt2)) {
            differenceCount++;
        }
    }

    // check if at least at 95% of all tries resultet in different strings
    // change this value according to your needs
    assertTrue(differenceCount >= 950);
}

我可以想到兩個測試用例 -

  • 檢查返回值是否為空。
  • 如果您希望它返回base64,請檢查返回是否為base64。 雖然你期待任何隨機字符串並不重要。

你可以檢查3件事:

  1. 如果結果為null或不為null
  2. 如果結果符合形式要求(是Base64字符串)
  3. 如果結果足夠隨機

例如,以下代碼可以工作。 我生成100種不同的隨機鹽,並允許它們之間最多匹配1個。

@Test
public void testGenerateSaltString() {

    Set<String> salts = new HashSet<String>();
    int countSame = 0;
    BASE64Decoder decoder = new BASE64Decoder();

    for(int i=0; i<100; i++) {
        String salt = YourClass.generateSaltString();
        assertNotNull(salt);
        try {
            decoder.decodeBuffer(encodedBytes);
       } catch (Exception e) {
           fail("Not Base64");
       }
       if (salts.contains(salt)) {
            sameCount++;
       }
       salts.add(salt);
    }

    assertTrue(countSame <= 1);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM