μ λ ₯μ λ³΄ν΅ λ©μλμ νλΌλ―Έν°λ‘ μ λ¬νλ€.
κ²°κ³Όλ μ¬λ¬ νμμΌλ‘ μ μν μ μλ€. (μ) λ¦¬ν΄ κ°, μ΅μΌμ ₯
κΈ°λ₯ μ€ν κ²°κ³Όμλ λ³κ²½λ ν¬ν¨νλ€. (μ) νμ κ°μ κΈ°λ₯μ DBμ νμ μ 보λ₯Ό μΆκ°νλ€.
TDDλ ν μ€νΈλ₯Ό λ§λλ κ²λΆν° μμνλ€.
νμ μ μ΄λ¦μ μ μνκ³ , νμ μ΄ μ 곡ν κΈ°λ₯μ κ²°μ νλ κ²μ κΈ°λ³Έμ μΈ μ€κ³ νμμ΄λ€.
TDD μ체λκ° μ€κ³λ μλμ§λ§, TDDλ₯Ό νλ€ λ³΄λ©΄ ν μ€νΈ μ½λλ₯Ό μμ±νλ κ³Όμ μμ μΌλΆ μ€κ³κ° μ§ν΄μκ² λλ€.
ν μ€νΈ μ½λλ₯Ό μμ±νκΈ° μν΄ κ°λ°μλ κΈ°λ₯ λͺ μΈλ₯Ό μ 리ν΄μΌ νλ€.
μꡬμ¬ν λͺ μΈμλ‘λ μλ΅λ λ΄μ©μ΄ λ§μλ° ν μ€νΈ μ½λλ₯Ό μμ±νλ €λ©΄ μ λ ₯κ³Ό κ²°κ³Όκ° λͺ νν΄μΌ νλ―λ‘ μ λ§€ν μ μ λ°κ²¬νλ©΄ κΈ°νμλ μ€λ¬΄ λ΄λΉμμ μκΈ°ν΄μ μν©μ λ°λΌ κΈ°λ₯μ΄ μ΄λ»κ² λμν΄μΌ νλμ§ κ΅¬μ²΄μ μΌλ‘ μ 리ν μ μλ€.
λͺ¨νΈν μν©μ λ§λλ©΄ μ΄λ₯Ό ꡬ체μ μΈ μλ‘ λ°κΎΈμ΄ ν μ€νΈ μ½λμ λ°μνλ€.
νΉμ μν©μμ μ½λκ° μ΄λ»κ² λμνλμ§ μ΄ν΄νκ³ μΆλ€λ©΄ ν΄λΉ μν©μ κ²μ¦νλ ν μ€νΈλ₯Ό μ€ννκ³ μ΄ν΄κ° νμν μ½λλ₯Ό μΆμ νλ©΄ λλ€. μ΄λ μ μ§λ³΄μμ ν° λμμ΄ λλ€.
JUnit μ½λμ κΈ°λ³Έ ꡬ쑰λ @Test μ λ Έν μ΄μ μ λ©μλμ λΆμ΄λ κ²μ΄λ€.
JUnit Assertions ν΄λμ€λ assertEquals() λ©μλμ κ°μ΄ κ°μ κ²μ¦νκΈ° μν λ€μν μ μ λ©μλλ₯Ό μ 곡νλ€.
assertEquals(expected, actual)
assertNotEquals(unexpected, actual)
assertSame(Object expected, actual)
: λ κ°μ²΄κ° λμΌν κ°μ²΄μΈμ§ κ²μ¬νλ€.assertNotEquals(Object unexpected, actual)
assertTrue(boolean condition)
assertFalse(boolean condition)
assertNull(Object actual)
assertNotNull(Object actual)
fail()
: ν
μ€νΈ μ€ν¨ μ²λ¦¬Assertionsκ° μ 곡νλ μ΅μ μ λ°μ μ 무 κ²μ¬ λ©μλ
assertThrows(Class<T> expectedType, Executable executable)
seertDoesNotThrow( Executable executable)
@BeforeEach
@AfterEach
@BeforeAll
@AfterAll
public class LifecycleTest {
public LifecycleTest() {
System.out.,println("new LifecycleTest");
}
@BeforeEach
void setUp() {
System.out.,println("setUp");
}
@Test
void a() {
System.out.,println("A");
}
@Test
void b() {
System.out.,println("B");
}
@BeforeEach
void tearDown() {
System.out.,println("tearDown");
}
}
μ€ν κ²°κ³Ό
new LifecycleTest
setUp
A
tearDown
new LifecycleTest
setUp
B
tearDown
κ° ν μ€νΈ λ©μλλ μλ‘ λ 립μ μΌλ‘ λμν΄μΌνλ€.
μλ‘ νλλ₯Ό 곡μ νλ€κ±°λ μ€ν μμλ₯Ό κ°μ νκ³ ν μ€νΈ μμ±νμ§ λ§μμΌνλ€.
JUnitμ ν μ€νΈ λ©μλμ μ€ν μμλ₯Ό μ§μ νλ λ°©λ²μ μ 곡νκ³ μλ€, νμ§λ§ κ° ν μ€νΈλ λ 립μ μΌλ‘ λμν΄μΌ νλ€. ν μ€νΈ λ©μλ κ°μ μμ‘΄μ΄ μκΈ°λ©΄ μ μ§λ³΄μλ₯Ό μ΄λ ΅κ² λ§λ λ€.
@DisplayName
@Disabled
λ
Έλ ¨ν κ°λ°μλ μ΄λ€ μν©μ΄ μ€ν κ²°κ³Όμ μν₯μ μ€ μ μλμ§ μ°ΎκΈ° μν΄ λ
Έλ ₯νλ€.
μ£Όμ΄μ§ μν©μ λ°λΌ κΈ°λ₯ μ€ν κ²°κ³Όλ λ¬λΌμ§λ€. μ΄λ ν μ€νΈ μ½λ ꡬ쑰μλ μν₯μ μ€λ€.
μ΄λ€ μν©μ΄ μ£Όμ΄μ§κ³ , κ·Έ μν©μμ κΈ°λ₯μ μ€ννκ³ , μ€νν κ²°κ³Όλ₯Ό νμΈνλ μΈ κ°μ§κ° ν μ€νΈ μ½λμ κΈ°λ³Έ 골격μ΄λ€.
JUnitμμ μν©μ μ€μ νλ λ°©λ²μ ν μ€νΈν λμμ λ°λΌ λ¬λΌμ§λ€.
@Test
void exactMatch() {
// μ λ΅μ΄ 456μΈ μν©
BaseballGame game = new BaseballGame("456");
// μ€ν
Score score = game.guess("456)
// κ²°κ³Ό νμΈ
assertEquals(3, score.strikes());
assertEquals(0, score.balls());
}
@Test
void noMatch() {
// μ λ΅μ΄ 123μΈ μν©
BaseballGame game = new BaseballGame("123");
// μ€ν
Score score = game.guess("456)
// κ²°κ³Ό νμΈ
assertEquals(0, score.strikes());
assertEquals(0, score.balls());
}
@BeforeEach
void givenGame() {
BaseballGame game = new BaseballGame("456");
}
@Test
void exactMatch() { // μ€ν
Score score = game.guess("456)
// κ²°κ³Ό νμΈ
assertEquals(3, score.strikes());
assertEquals(0, score.balls());
}
@Test
void noMatch() {
// μ€ν
Score score = game.guess("456)
// κ²°κ³Ό νμΈ
assertEquals(0, score.strikes());
assertEquals(0, score.balls());
}
@Test
void meetsAllCriteria_Then_Strong() {
// μ€ν
PasswordStrengthMeter meter = new PasswordStrengthMeter();
PasswordStrength result = meter.meter("ab12!@AB");
// κ²°κ³Ό νμΈ
assertEquals(PasswordStrength.STRONG, result);
}
@Test
void genGame_With_DupBumber_Then_Fail() {
assertThrows(IllegalArgumentException.calss,
() -> new BaseballGame("110")
);
}
μν© μ€μ μ ν μ€νΈ λμλΏλ§ μλλΌ μΈλΆ μμΈλ μλ€.
File dataFile = new File("file.txt");
long sum = MathUtils.sum(dataFile);
νμΌμ΄ μ‘΄μ¬νμ§ μλ μν©μ μκ°ν΄λ³΄μ.
@Test
void noDataFile_Then_Exception() {
File dataFile = new File("badpath.txt");
assertThrows(TllegalArgumentException.class,
() -> MathUtils.sum(dataFile));
}
@Test
void noDataFile_Then_Exception() {
givenNoFile("badpath.txt");
File dataFile = new File("badpath.txt");
assertThrows(TllegalArgumentException.class,
() -> MathUtils.sum(dataFile));
}
private void givenNoFile(String path) {
File file = new File(path);
if (file.exists()) {
boolean delete = file.delete();
// ν΄λΉ κ²½λ‘μ νμΌμ΄ μ‘΄μ¬νλμ§ κ²μ¬ν΄μ μ‘΄μ¬ν κ²½μ° ν΄λΉ νμΌμ μμ νλ€.
if (!deleted)
throw new RuntimeException("faile givenNoFile:" + path);
}
}
@Test
void dataFileSumTest() {
File dataFile = new File("src/test/resources/datafile.txt");
long sum = MathUtils.sum(dataFile);
asserEquals(101, sum);
}
@Test
void dataFileSumTest2() {
givenDataFile("target/datafile.txt", "1", "2", "3", "4");
File dataFile = new File("target/datafile.txt");
long sum = MathUtils.sum(dataFile);
asserEquals(101, sum);
}
private void givenDataFile(String path, String... lines) {
try {
Path dataPath = Paths.get(path);
if(Files.exists(dataPath)) {
Files.delete(dataPath);
}
Files.write(dataPath, Arrays.asList(lines));
} catch(IOException e) {
throw new RuntimeException(e);
}
}
ν μ€νΈ μ½λλ ν λ²λ§ μ€ννκ³ λλμ§ μλλ€.
κ°νμ μΌλ‘ μ€ν¨νκ±°λ μ±κ³΅νλ©΄ ν μ€νΈ μ λ’°λκ° λ¨μ΄μ§λ€.
ν΄κ²°λ°©λ²μ ν μ€νΈ μ€ν μ μ μΈλΆλ₯Ό μνλ μνλ‘ λ§λ€κ±°λ ν μ€νΈ μ€ν νμ μΈλΆ μνλ₯Ό μλλλ‘ λλλ € λμμΌ νλ€.
μν©κ³Ό κ²°κ³Όμ μν₯μ μ£Όλ μΈλΆ μμΈμ νμΌ, DBMS, μΈλΆ μλ² REST API λ± λ€μνλ€.
μΈλΆ μν©μ ν μ€νΈ μ½λμμ λ§μλλ‘ μ μ΄ν μ μλ κ²½μ°λ μλ€.
ν μ€νΈ λμμ μν©κ³Ό κ²°κ³Όμ μΈλΆ μμΈμ΄ κ΄μ¬ν κ²½μ° λμμ μ¬μ©νλ©΄ ν μ€νΈ μμ±μ΄ μ¬μμ§λ€.
λμμ ν μ€νΈ λμμ΄ μμ‘΄νλ λμμ μ€μ ꡬνμ λμ νλ ꡬνμΈλ° μ΄ λμμ ν΅ν΄μ μΈλΆ μν©μ΄λ κ²°κ³Όλ₯Ό λ체ν μ μλ€.
given
), κ·Έ μν©μμμ μ€ν(when
), κ·Έλ¦¬κ³ κ·Έ κ²°κ³Όλ₯Ό νμΈνλ(then
) μΈ κ°μ§λ‘ ꡬμ±λ©λλ€. μ΄ κ΅¬μ‘°λ ν
μ€νΈ μ½λμ κ°λ
μ±μ λμ΄κ³ , λ
Όλ¦¬μ μΈ νλ¦μ λͺ
νν νλ λ° μ μ©ν©λλ€.