Hur jUnit testar man branch coverage?

Trädvy Permalänk
Medlem
Plats
Skåne
Registrerad
Jan 2011

Hur jUnit testar man branch coverage?

Jag har en android app gjord i Android studio som jag ska testa lite Branch Covering på. Efter mycket om och men har jag lyckats generera en test klass med test metoder, en för varje metod i MainActivityn. Nu är problemen, hur skriver jag tesfallen? Det är ju enkelt om det är en siffra t ex men se följande metod.

public void userCheck() { if(!controller.isUserCreated()) { startInitialFragment(); } else { loadProgressBars(); } }

Hur skriver jag då ett testfall för detta om jag vill kontrollera att båda brancherna exekveras?

@Test public void testUserCheck() throws Exception { //Någonting }

Min testklass känner inte till något om mainActivity eller någon annan klass för den delen. Metoden tar ju ingen input heller så jag förstår verkligen inte hur jag testar detta. En tanke var att låta metoden retunera en int och sätta den t ex 1 om if satsen körs eller 2 om else satsen körs och retunera denna. Men då blir det problem med andra metoder som använder userCheck() eftersom dessa inte förväntar sig något tillbaka och det hela slutar med att jag får ändra massor i koden.

Om jag klickat på run knappen på testUserCheck() i testklassen kan jag ju trycka "run with coverage", innebär det att alla branches testas? I fallet ovan kan jag ju t ex inte göra en ny Context vilket min Controller behöver,

Någon som vet vad jag kan göra?

För nuvarande känns det enklare att bara lägga till ett logg meddelande i varje metod med flera branches och se om alla loggar skrivs ut...

Asrock P67 Extreme 4 | i5 2500K@4,5Ghz | Asus GTX 970 black | 2x Intel 520 180gb, 2x WD blue 5tb | 8GB Corsair XMS3 + 8GB Hyper x Fury | EVGA Supernova G2 750W Gold | Silverstone FT02

https://prism-break.org/sv/

Trädvy Permalänk
Medlem
Registrerad
Aug 2002

Titta på att använda nån form av t ex mock-ramverk.
Då får du skicka in en mock på det som nu kör dina 2 funktioner och sen låta unittestet verifiera via mock:en att rätt funktion kördes..

Oklar på om detta är bästa sättet dock.

Edit: slängde ihop ett snabbt exempel i c#, försökte hålla mig till det du verkar ha men har aldrig kodat android så lite oklar på hur det hänger ihop.

Testet körs två gånger, en gång med true, en false, för isusercreated.
Mockramverket hjälper sen till att verifiera att rätt metod har körts. (Som en bonus så kan man t ex som i första fallet jag visar även verifiera hur många gånger metoden ska köras)

[TestFixture] public class UnitTest { [Test] [TestCase(true)] [TestCase(false)] public void MoqTest(bool isUserCreated) { // Arrange var mock = new Mock<ISomeInterface>(); var sut = new MainActivity(mock.Object); // Act sut.UserCheck(isUserCreated); // Assert if(isUserCreated) mock.Verify(x => x.LoadProgressBars(), Times.Once); else mock.Verify(x => x.StartInitialFragment()); } } public class MainActivity { private readonly ISomeInterface _si; public MainActivity(ISomeInterface si) { _si = si; } public void UserCheck(bool isUserCreated) { if(isUserCreated) _si.LoadProgressBars(); else _si.StartInitialFragment(); } } public interface ISomeInterface { void LoadProgressBars(); void StartInitialFragment(); }