# Testen eines Bridge-Spiels



## babuschka (14. Dez 2011)

Hallo, folgende Aufgabe ist gestellt:

Gestet werden soll eine Software zum Spielen des Kartenspiels Bridge (Black-Box-Testen).
Diese Software besteht aus vier Klassen:

PlayingCard
PlayingSet
Hand
BridgePlayer

und drei Aufzählungen:

Suit
Rank
Bid


Dabei sind die vorkompilierten class-Dateien gegeben und eine dazugehörige Doxygen-Dokumentation.


Die Methode getOpeningBid() in der Klasse BridgePlayer soll dazu dienen, die Stärke eines Blatts mit 13 unterschiedlichen Karten abzuschätzen und abhängig davon entweder ein Angebot abzugeben (s. diese Tabelle: "Alle Gebote im Bridge" bei Wikipedia: http://de.wikipedia.org/wiki/Bridge_(Kartenspiel)) oder zu passen.


Bei der Bewertung des Blatts gibt es zwei Kriterien:

1.) Kartenpunkte:

Ass = 4 Punkte
König = 3 Punkte
Dame = 2 Punkte
Bube = 1 Punkt
jede Zahlkarte = 0 Punkte

2.) Kartenverteilung: 

Die vier grundlegenden Verteilungen sind:

a) Gleichmäßige Verteilung: Alle Karten sind gleichmäßig über die vier Farben verteilt. Je Farbe gibt es mindestens zwei und höchstens fünf Karten.

b) Einfarbige Verteilung: Setzt eine Karte mit mindestens 5 Karten voraus. Diese wird als dominant bezeichnet. Alle anderen Farben haben höchstens 4 Karten. Wenn die dominante Farbe genau 5 Karten hat, gibt es eine andere Farbe mit genau einer Karte.

c) Zweifarbige Verteilung: Setzt zwei Farben mit mindestens 5 Karten voraus. Diese werden als dominant bezeichnet.

d) Dreifarbige Verteilung: Setzt drei Farben mit mindestens 4 Karten voraus. Diese werden als dominant bezeichnet.



Die Aufgabe ist es, die Methode getOpeningBid() gegen folgende Anforderungen zu testen:

1. Fall: Das Blatt enthält nicht 13 unterschiedliche Karten. Ausgabe: Invalid
2. Fall: zwischen 15 und 22 Punkten und gleichmäßige Verteilung. Ausgabe: 1 NT
3. Fall: 14-22 Punkte, einfarbige Verteilung. Ausgabe: 1 Pik, wenn Pik die dominante Farbe ist usw.
4. Fall: 13-22 Punkte, zweifarbige Verteilung
5. Fall: 12-22 Punkte, dreifarbige Verteilung
6. Fall: 23 oder mehr
7. Fall: Voraussetzungen von Fall 1 bis 6 nicht erfüllt

Schwierigkeit:

Die Methode getOpenBid() ruft selbst die Methode getHand() auf, d.h.
Die Methode getHand() muss gestubbt werden.


Die Tests sollen direkt in den Doxygen-Kommentaren dokumentiert werden.


-------------------------------------------

Das war jetzt viel Text!!

Ich habe soweit alles vorbereitet, dass ich die Tests in Eclipse ausführen lassen könnte.
Es ist folgendes Gerüst für die Testklasse BridgePlayerTest.java gegeben:



```
import org.junit.*;
import org.junit.runner.*;
import org.junit.Assert.*;

public class BridgePlayerTest {

 @Test
 public void testGetOpenBid_00()  {

   public Hand getHand()  {
   PlayingCard cards[] = new PlayingCard[13];
   cards[0]=CardSet.CLUB_K;
   cards[1]=CardSet.HEART_2;
   cards[2]=CardSet.SPADE_2;
   cards[3]=CardSet.DIAMOND_A;
   cards[4]=CardSet.CLUB_3;
   cards[5]=CardSet.CLUB_4;
   cards[6]=CardSet.CLUB_5;
   cards[7]=CardSet.CLUB_6;
   cards[8]=CardSet.CLUB_7;
   cards[9]=CardSet.CLUB_8;
   cards[10]=CardSet.CLUB_9;
   cards[11]=CardSet.CLUB_A;
   cards[12]=CardSet.SPADE_A;

   return new Hand( cards );

}
};

Assert.assertTrue("Player doesn't bid 1 club on 15 points and 9-2-2-1 distribution!", player.getOpeningBid() == Bid.ONE_CLUB );

}

@Test
public void testGetOpeningBid_01() {

// Hier wird jetzt folgendes Blatt erzeugt, ich habe aber keine Lust mehr, das abzutippen:
//   Kreuz 2, Herz 2, Pik 2, Karo 4, Kreuz 3, Kreuz 4, Kreuz 5, Kreuz 6, Kreuz 7, Kreuz 8, Kreuz 9, 
//   Kreuz 10, Kreuz Bube
```




Jede Anforderung muss durch mindestens einen Testfall abgedeckt werden. Grenzfälle sollen auch getestet werden.


Verstehe ich das richtig, dass hier zwei Testfälle vorgegeben sind:
Der erste für Fall 3, der zweite für den Fall Pass?

Und dass ich jetzt diese beiden Fälle erstmal implementieren muss (inkl. Grenzfälle) und dann das Gleiche für die restlichen 5 Fälle?



Was muss ich denn hier eigentlich in dem Code ergänzen?

Und wie kann ich die Methode getHand() stubben?


----------



## babuschka (14. Dez 2011)

Achso, ich hab mir's grad nochmal angeguckt:

Ist hier nicht ein Testfall eigentlich schon (inkl. Stubben) komplett vorgemacht?


----------



## babuschka (14. Dez 2011)

Oder nochmal anders gefragt:

In dem obigen Java-Code ist das Testen und Stubben schon an einem Testfall vorgemacht, oder?

Ich muss das jetzt "nur noch" auf die anderen Fälle quasi anpassen?


Mir also Beispiele ausdenken, bei denen die entsprechenden Fälle erfüllt sind?



Oder missverstehe ich hier was?

Für mich ist der gegebene Code für die beiden gegebenen Testfälle irgendwie schon fertig - nur, dass ich halt die anderen Fälle noch ergänzen muss...


----------



## babuschka (15. Dez 2011)

*Die obige(n) Frage(n) sind geklärt.*

Ich frage mich jedoch, was ich alles so testen muss.

Ich habe bis jetzt folgende Tetsts:


*ID T001: Das Blatt enthält nicht 13 unterschiedliche Karten
Ausgabe: INVALID*

Meine Tests hierzu: 
Test 1: 4 gleiche Karten ("normaler Test")
Test 2: 1 Karte doppelt, sprich: 2 gleiche Karten ("unterer Grenzwerttestfall")
Test 3: 13 gleiche Karten ("oberer Grenzwerttestfall")

*ID T002: zwischen 15 und 22 Punkten und gleichmäßige Verteilung
Ausgabe: 1 NT*

Meine Tests hierzu:
Test 1: 18 Punkte, gleichm. Verteilung 4-4-3-2 Verteilung ("normaler" Test)
Test 2: 15 Punkte, gleichm. Verteilung 5-3-3-2 (unterer Grenzwerttestfall)
Test 3: 22 Punkte, gleichm. Verteilung 4-4-3-2 (oberer Grenzwerttestfall)

*ID T003: zwischen 14 und 22 Punkten und eine einfarbige Verteilung
Ausgabe: 1Kreuz, wenn Kreuz die dominante Farbe ist
1Karo, wenn Karo die dominante Farbe ist
usw.*

Meine Tests hierzu:
Test 1: 15 Punkte, einfarbige Verteilung 9-2-1-1 
Test 2: 14 Punkte, einfarbige Verteilung 
Test 3: 22 Punkte, einfarbige Verteilung

*ID T004: zwischen 13 und 22 Punkten, zweifarbige Verteilung
Ausgabe: 1Kreuz, wenn Kreuz eine der zwei dominanten Farben im Blatt ist
1 Karo, wenn Karo und Herz oder Karo und Pik die dom. Farben sind
1Herz, wenn Herz und Pik die dom. Farben sind*

Meine Tests hierzu:
Test 1: 17 Punkte und zweifarbige Verteilung 7-6-0-0
Test 2: 13 Punkte und zweifarbige Verteilung
Test 3: 22 Punkte und zweifarbige Verteilung

*ID T005: zwischen 12 und 22 Punkten und eine dreifarbige Verteilung
Ausgabe: 1Kreuz, wenn Kreuz unter den dom. Farben ist, sonst 1Karo*

Meine Tests hierzu:
Test1: 15 Punkte und dreifarb. Verteilung 5-4-4-0
Test2: 12 Punkte und dreifarbige Verteilung
Test3: 22 Punkte und dreifarbige Verteilung

*T006: 23 Punkte oder mehr.
Ausgabe: 2Kreuz*

Meine Tests hierzu:
Test1: 28 Punkte
Test2: 23 Punkte
Test2 34 Punkte (weil 34 doch maximal erreicht werden können?)


So und jetzt kommt meine eigentliche Frage erst.

Hierzu fehlen noch die Tests:

*T007: Die Voraussetzungen von T001-T006 sind nicht erfüllt.
Ausgabe: PASS*

Was muss ich hier alles testen??


----------



## babuschka (15. Dez 2011)

Muss ich da Folgendes noch testen:

15-22 einfarbig
15-22 zweifarbig
15-22 dreifarbig

14-22 gleichmäßig
14-22 zweifarbig
14-22 dreifarbig

13-22 gleichmäßig
13-22 einfarbig
13-22 dreifarbig

12-22 gleichmäßig
12-22 einfarbig
12-22 zweifarbig

0-11 Punkte

und da jeweils ein Beispieltestfall?


----------



## fastjack (15. Dez 2011)

Ja, ich denke das sollst Du auch noch machen 

Vielleicht ein kleiner Tip. Nimm mal Emma zum covern der zu testenden Klassen. Dabei siehst Du dann, welche Codezeilen Deine Tests in den zu testenden Klassen ausgeführt haben. Damit kann man zwar nicht 100ig sicher sein, aber man erkennt schonmal Schwachstellen von seinen Tests.


----------



## babuschka (16. Dez 2011)

Aber irgendwie macht das doch keinen Sinn, oder?

Wenn ich jetzt zum Beispiel testen will:

15-22 Punkte und einfarbige Verteilung, so lande ich doch in R003 und das habe ich doch schon getestet.


----

Die Voraussetzungen von R001-R006 sind nicht erfüllt. Was heißt denn das?

Ich denke, da muss ich nur den Fall 0-11 Punkte noch testen!

[Alles Andere geht, wie gesagt, m.E. in die Fälle über, die ich schon getestet habe!]


----------



## babuschka (16. Dez 2011)

Ich habe meine Meinung nochmal geändert. 


Und zwar ist meiner Meinung nach noch Folgendes zu testen:

0-11 Punkte

12-14 Punkte und gleichmäßige Verteilung

12-13 Punkte und einfarbige Verteilung

12 Punkte und zweifarbige Verteilung

13 unterschiedliche Karten





Alle anderen Fälle sind m.E. eben schon abgedeckt.


----------



## babuschka (16. Dez 2011)

Hallo, könnt ihr mir bei einem Problem helfen:

Der folgende Quellcode beschreibt einen (von vielen Tests), die ich für eine Aufgabe gemacht habe.
Was muss ich dort für

tag
condition
event
expected
req
req

hinschreiben?


```
//"normaler" Test für R004: 17 Punkte und zweifarbige Verteilung (7-6-0-0)
    //Herz und Karo dominant
    @Test
    public void testGetOpeningBid_09() {
    	
    	/**
    	 * @test
    	 * <b>tag</b> "R003" <br>
    	 * <b>condition</b><br>
    	 * <b>event</b>>br>
    	 * <b>expected</b>Spieler bietet 1Karo<br>
    	 * <b>req</b><br>
    	 * <b>req</b><br>
    	 * 
    	 */
    	
    	BridgePlayer player = new BridgePlayer() {
    		
    		public Hand getHand() {
    			PlayingCard cards[] = new PlayingCard[13];
    			cards[0] = CardSet.HEART_2;
    			cards[1] = CardSet.DIAMOND_A;
    			cards[2] = CardSet.DIAMOND_K;
    			cards[3] = CardSet.HEART_A;
    			cards[4] = CardSet.HEART_7;
    			cards[5] = CardSet.DIAMOND_Q;
    			cards[6] = CardSet.HEART_K;
    			cards[7] = CardSet.HEART_J;
    			cards[8] = CardSet.HEART_9;
    			cards[9] = CardSet.HEART_3;
    			cards[10] = CardSet.DIAMOND_2;
    			cards[11] = CardSet.DIAMOND_7;
    			cards[12] = CardSet.DIAMOND_5;
    			
    			return new Hand( cards );
    		}
    	};
    	
    	Assert.assertTrue( "Player doesn't bid 1 diamond on 17 Points and 7-6-0-0 distribution!", player.getOpeningBid() == Bid.ONE_DIAMOND);
    		}
```

Zur Info:
Bei diesem Testbeispiel soll getestet werden, ob ein Bridge-Spieler bei einer Kartenpunktzahl von 17 Punkten und einer zweifarbigen Verteilung 1Karo setzt.


----------

