簡體   English   中英

如何使用Junit測試長數組?

[英]How to use Junit for testing long arrays?

我剛剛開始進行單元測試(junit)。 我看了一些來自Roy Osherove的視頻,在那里他談到了好的做法。 由於我對這個主題很新,我覺得完全迷失了。 下面是我的代碼的一個簡短示例,然后是我到目前為止測試的方式以及如何創建適合的junit測試。 從本質上講,我正在制作一張帶有52張牌的牌組。 當我創建一個新的“甲板”對象時,我想測試甲板是否包含所有52張牌。

我的代碼中可能有一些錯誤,但它更多的是關於邏輯(最后看問題)。

生產代碼


想象一下,我想創建一個共同的卡片組,其中包括4個套裝和13個等級。 我們還假設我創建了一個“card”類和一個“deck”類,它包含一個實例變量,這是一個由52張卡組成的數組。

“卡”類:

public class card {

private String[] suits = {"h", "s", "c", "d"};
private String[] ranks = {"2","3", "4", "5", "6", "7", "8", "9", "T", "J", "Q", "K", "A"};

private String suit, rank;


public card (int rank, int suit) {
    this.suit = this.suits[suit];
    this.rank = this.ranks[rank];
}

public String getRank () {
    return rank;
}

public String getSuit () {
    return suit;
}
}

“甲板”類:

public class deck {

private card[] deckCards = new card[52];

public deck() {

    int i = 0;

    for(int suit = 0; suit<4; suit++) {
        for(int rank=0; rank<13; rank++) {
            this.deckCards[i] = new card(rank,suit);
            i = i+1;
        }
    }

}

public card[] getDeckCards() {
     return deckCards;
}
}

考試


那么,如果我想創建一個junit測試,我的測試看起來就像是對了嗎?

public class Main {

public static void main(String[] args) {

    deck deck = new deck();
    int counter = 0;

    for (int i = 0; i<52; i++) {

        if (deck.deckCards[i] != null) counter++;


    }

    System.out.println("Cards in deck: " + counter);

    for (int i = 0; i<52; i++) {
        if (deck.deckCards[i] != null) System.out.println(deck.deckCards[i].getRank() + deck.deckCards[i].getSuit());
    }



}
}

結果我會得到這樣的東西:

  • 甲板卡:52
  • 2h,3h,4h,5h,6h,7h,8h,9h,Th,Jh,Qh,Kh,Ah,2s,3s,4s,5s,6s,7s,8s,9s,Ts,Js,Qs,Ks, As,2c,3c,4c,5c,6c,7c,8c,9c,Tc,Jc,Qc,Kc,Ac,2d,3d,4d,5d,6d,7d,8d,9d,Td,Jd,Qd, KD,廣告

現在我可以看看所有卡片,我會看到一切都像我想要的那樣。 顯然,這不是你測試的方式..

現在,如果我想創建一個Junit測試,我會做以下事情:

@Test
public void testDeck() {

    // create the expected value; which is 52 cards
    card[] expected = {new card(0,0),
                       new card(1,0),
                       new card(2,0),
                       ...          ,
                       new card(12,0),
                       new card(0,1),
                       ...          ,
                       new card(12,1),
                       new card(0,2),
                       ...          ,
                       new card(12,2),
                       new card(0,3),
                       ...          ,
                       new card(12,3)}



    // instantiate the deck
    deck carddeck = new deck();
    card[] actuals = carddeck.getCardDeck();

    //assert
    assertArrayEquals(expected, actuals);
}

現在,我有幾個問題:

  1. Roy說我們不應該在測試方法/案例中使用任何邏輯。 顯然我確實使用邏輯來創建我的“預期”,即卡類的構造函數。 但是,我如何使用硬編碼值? 當我有預期的字符串或int時很容易,但是如果我有更復雜的結構,比如這個對象怎么辦?
  2. 如果我的卡牌有1000張卡怎么辦? 那么就不可能手動創建一個包含1000個字段的數組。 但是我怎么能測試呢?

非常感謝幫助我:)

我會問自己的問題是:

  • 如果我改變算法(在這種情況下是deck的構造函數),那么可能出現什么問題?
  • 算法的關鍵規則是什么?
  • 如果出現問題,哪些測試會立即失敗?

在您的示例中,我將測試以下期望:

  • 橋面由52張卡,沒有兩個卡甲板(加入所有的卡到內平等Set ,看看是否有內52卡)。
  • 邊境案例卡在甲板內 - 可能是2h,2s,2c,2d,Ah,As,Ac,Ad。
  • 如果這是一個商業案例,而某些訴訟和/或職級比其他人更重要,我會為他們添加一些額外的測試。

junit中的理論運動員可以更好地完成這項工作。 理論運行器將自動生成測試數據的各種組合。

  • 使用TestedOn注釋。

     @RunWith(Theories) public class DeckTest { @Theory public void testCard() { @TestedOn(0, 1, 2, 3) int suit @TestedOn(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12) int rank) { Card card = new Card(rank, suit); Deck cardDeck = new Deck(); Card[] cards = cardDeck.getDeckCards(); assertThat(cards, hasItem(card)); // you should static import assertThat and hasItem } } 
  • 使用DataPoints和FromDataPoints批注

     @RunWith(Theories) public class DeckTest { @DataPoints("suits") public final static int[] SUITS = {0, 1, 2, 3}; @DataPoints("rnaks") public final static int[] RANKS = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}; @Theory public void testCard( @FromDataPoints("suits") int suit, @FromDataPoints("ranks") int rank) { Card card = new Card(rank, suit); Deck cardDeck = new Deck(); Card[] cards = cardDeck.getDeckCards(); assertThat(cards, hasItem(card)); } } 

你知道你想要這種方法的52張不同的牌,你知道只有52張可能的牌。 因此,您可以創建一個equals()方法來比較套裝和等級 - 當然,測試驅動該方法 - 然后您對getCardDeck的測試可以將數組中的所有卡放入一個集合中。 如果你的設置包含52張牌,你的方法是有效的,因為只有52種可能性,而一套只能容納任意一張卡的一個副本,所以如果你的52元素陣列有任何重復,那么這個集合會更小。

暫無
暫無

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

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