Backend Language/TDD

[TDD Chapter6] ν…ŒμŠ€νŠΈ μ½”λ“œμ˜ ꡬ성

chaerlo127 2023. 2. 4. 22:33
728x90

πŸ€ κΈ°λŠ₯μ—μ„œμ˜ 상황

File file = new File("data.txt");
long sum = MathUtils.sum(dataFile);

λ‹€μŒκ³Ό 같은 μ½”λ“œλŠ” 파일이 μ—†κ±°λ‚˜ 잘λͺ» μž‘μ„±λœ μƒν™©μ—μ„œ μ—λŸ¬κ°€ λ°œμƒν•˜κ²Œ λœλ‹€.

이 λ•Œ, 잘λͺ»λ¨μ„ μΈμ§€ν•˜κ³  Exception 처리λ₯Ό ν•˜κ±°λ‚˜ 문제 상황을 return 을 ν•΄μ£Όμ–΄μ•Ό ν•œλ‹€. 

 

이처럼 μ˜ˆμ™Έ 상황을 μ°Ύμ•„λ‚΄κ³  μ½”λ“œμ— λ°˜μ˜ν•˜μ—¬ 비정상을 막아내야 ν•œλ‹€. 

 

κ°€λŠ₯ν•œ μ˜ˆμ™Έμƒν™©μ„ λ‹€ μ°Ύμ•„λ‚΄κΈ° μœ„ν•΄ λ…Έλ ₯ν•΄μ•Όν•˜κ³ 
κ·Έλ ‡κ²Œ ν•¨μœΌλ‘œμ¨ κ°œλ°œν•œ μ†Œν”„νŠΈμ›¨μ–΄μ˜ ν’ˆμ§ˆμ„ 높일 수 μžˆλ‹€. 

πŸ€ ν…ŒμŠ€νŠΈ μ½”λ“œμ˜ ꡬ성 μš”μ†Œ: 상황, μ‹€ν–‰, κ²°κ³Ό 확인

ν…ŒμŠ€νŠΈ μ½”λ“œ: κΈ°λŠ₯을 μ‹€ν–‰ν•˜κ³  κ·Έ κ²°κ³Όλ₯Ό 확인

λ”°λΌμ„œ, 상황(given), μ‹€ν–‰(when), κ²°κ³Ό(then)으둜 ꡬ성할 수 μžˆλ‹€. 

[상황이 주어지고, μƒν™©μ—μ„œ κΈ°λŠ₯을 μ‹€ν–‰ν•˜κ³ , μ‹€ν–‰ν•œ κ²°κ³Όλ₯Ό ν™•μΈν•˜λŠ” 세가지 ν…ŒμŠ€νŠΈ μ½”λ“œμ˜ κΈ°λ³Έ 골격을 이룸]

 

상황 - ν…ŒμŠ€νŠΈ λŒ€μƒ

1. λ©”μ„œλ“œ λ§ˆλ‹€ 객체λ₯Ό μƒμ„±ν•˜μ—¬ 상황을 μ„€μ •

2. @BeforeEachλ₯Ό μ μš©ν•œ λ©”μ„œλ“œμ—μ„œ 상황을 μ„€μ •, 상황 μ„€μ •κ³Ό κ΄€λ ¨λœ λŒ€μƒμ„ ν”Όλ“œλ‘œ 보관

3. 상황이 μ—†λŠ” 경우 (결과에 영ν–₯을 μ£ΌλŠ” 상황이 μ‘΄μž¬ν•˜μ§€ μ•ŠμŒ, κ²°κ³Ό 확인 μ½”λ“œλ§Œ 포함)

 

 

πŸ€ μ™ΈλΆ€ 상황과 μ™ΈλΆ€ κ²°κ³Ό

상황 - μ™ΈλΆ€ μš”μΈ

File file = new File("data.txt");
long sum = MathUtils.sum(dataFile);

MathUtils.sum을 ν…ŒμŠ€νŠΈλ₯Ό ν•˜κΈ° μœ„ν•΄μ„œλŠ” 파일이 μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ” μƒν™©μ—μ„œμ˜ κ²°κ³Όλ₯Ό 확인해야 ν•œλ‹€.

1. μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ” νŒŒμΌμ„ 경둜둜 μ„€μ •

2. 파일이 μ—†λŠ” 상황을 생성(λͺ…μ‹œμ μœΌλ‘œ 파일이 μ—†λŠ” 상황)

 

// μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ” 파일 경둜 μ‚¬μš©
@Test
void noDataFile_Then_Exception(){
	File dataFile = new File("badpath.txt");
    assertThrows(IllegalArgumentException.class,
    	() -> MathUtils.sum(dataFile)
    );
}

// λͺ…μ‹œμ μœΌλ‘œ 파일이 μ—†λŠ” 상황 생성
@Test
void noDataFile_Then_Exception(){
	givenNoFile("badpath.txt");
    
	File dataFile = new File("badpath.txt");
    assertThrows(IllegalArgumentException.class,
    	() -> MathUtils.sum(dataFile)
    );
}

// 파일이 μ‘΄μž¬ν•˜λŠ”μ§€ νŒŒμ•…ν•˜μ—¬ μ‘΄μž¬ν•  경우 파일 μ‚­μ œ
private void givenNoFile(String path){
	File file = new File(path);
    	if(file.exists()){
        	boolean deleted = file.delete();
            if(!deleted)
            	throw new RuntimeException("fail givenNoFile: " + path);
		}
}

 

μœ„μ˜ 상황은 νŒŒμΌμ„ 미리 λ§Œλ“€μ–΄λ‘κ³  μ‚¬μš©ν•œ 것이라면, νŒŒμΌμ„ 미리 λ§Œλ“€μ§€ μ•Šκ³  ν…ŒμŠ€νŠΈ μ½”λ“œμ—μ„œ 상황에 λ§žλŠ” νŒŒμΌμ„ μƒμ„±ν•˜λŠ” 방법도 μžˆλ‹€. 

 

@Test
void dataFileSumTest2(){
	givenDatafile("target/datafile.txt", "1", "2", "3", "4");
    File file = new File("target/datafile.txt");
    long sum = MathUtils.sum(dataFile);
    assertEquals(10L, sum);
}

// ν…ŒμŠ€νŠΈ μ½”λ“œμ—μ„œ 상황에 맞게 νŒŒμΌμ„ 생성
@Test
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);
    }
}

μœ„μ™€ 같이 μ½”λ“œλ₯Ό μž‘μ„±ν•˜λ©΄ ν…ŒμŠ€νŠΈ λ‚΄μš”μ„ μ΄ν•΄ν•˜κΈ° μœ„ν•΄ λ§Žμ€ νŒŒμΌμ„ λ³Ό ν•„μš”κ°€ μ—†λ‹€λŠ” μž₯점이 μžˆλ‹€. 

 

πŸŽ„ μ™ΈλΆ€ μƒνƒœκ°€ ν…ŒμŠ€νŠΈ 결과에 영ν–₯을 주지 μ•Šκ²Œ ν•˜κΈ°

ν…ŒμŠ€νŠΈ μ½”λ“œλŠ” ν•œ 번만 μ‹€ν–‰ν•˜κ³  λλ‚˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ—, 개발 이후에도 ν…ŒμŠ€νŠΈκ°€ 잘 μ§„ν–‰λ˜λŠ”μ§€ 반볡적으둜 확인해보아야 ν•œλ‹€. κ·Έλ ‡κΈ° λŒ€λ¬Έμ— κ°„ν—μ μœΌλ‘œλΌλ„ μ‹€νŒ¨λ₯Ό ν•˜κ²Œ λ˜κ±°λ‚˜ λ‹€λ₯Έ ν…ŒμŠ€νŠΈ λ‹€μŒμ— μ‹€ν–‰ν•΄μ•Ό 성곡이 되면 ν…ŒμŠ€νŠΈ μ½”λ“œλ₯Ό 믿을 수 μ—†κ²Œ λ˜λŠ” 것이닀. 

 

μ™ΈλΆ€ μƒνƒœμ— 따라 ν…ŒμŠ€νŠΈμ˜ κ²°κ³Όκ°€ 달라지지 μ•Šκ²Œ ν•˜κΈ°

1. ν…ŒμŠ€νŠΈ μ‹€ν–‰ 전에 μ™ΈλΆ€λ₯Ό μ›ν•˜λŠ” μƒνƒœλ‘œ λ§Œλ“€κΈ°
2. ν…ŒμŠ€νŠΈ μ‹€ν–‰ 후에 μ™ΈλΆ€ μƒνƒœλ₯Ό μ›λž˜λŒ€λ‘œ λ˜λŒλ €λ‘κΈ°

 

πŸŽ„ μ™ΈλΆ€ μƒνƒœμ™€ ν…ŒμŠ€νŠΈ 어렀움

상황과 결과에 영ν–₯을 μ£ΌλŠ” μ™ΈλΆ€ μš”μΈ: 파일, DBMS, μ™ΈλΆ€ μ„œλ²„ λ“±λ“±,,

 

μ™ΈλΆ€ ν™˜κ²½μ„ ν…ŒμŠ€νŠΈμ— 맞게 κ΅¬μ„±ν•˜λŠ” 것은 항상 κ°€λŠ₯ν•œ 것이 μ•„λ‹ˆκΈ° λ•Œλ¬Έμ—, λŒ€μ—­μ„ μ‚¬μš©ν•˜μ—¬ ν…ŒμŠ€νŠΈ μž‘μ„±μ„ μ§„ν–‰ν•œλ‹€.

 

λŒ€μ—­μ€ ν…ŒμŠ€νŠΈ λŒ€μƒμ΄ μ˜μ‘΄ν•˜λŠ” λŒ€μƒμ˜ μ‹€μ œ κ΅¬ν˜„μ„ λŒ€μ‹ ν•˜λŠ” λŒ€μ‹ μ—, 이 λŒ€μ—­μ„ ν†΅ν•΄μ„œ κ²°κ³Όλ₯Ό λŒ€μ²΄ν•  수 μžˆλ‹€.

 

μ™ΈλΆ€ μƒνƒœκ°€ ν…ŒμŠ€νŠΈλ₯Ό λ°©ν•΄ν•˜λŠ” 경우
1. μ™ΈλΆ€ μ„œλ²„μ™€ 연동 μ‹œ, μ„œλ²„μ— 연동할 수 μ—†λŠ” μƒν™©μ΄λ‚˜ 응닡 μ‹œκ°„μ„ λ³€κ²½ν•˜κ³  싢은 경우
2. μ™ΈλΆ€ DB에 μ ‘κ·Ό μ‹œ, ν…Œμ΄λΈ”μ˜ κΆŒν•œ μ„€μ •μœΌλ‘œ μΈν•΄μ„œ 생성, μ‘°νšŒλŠ” κ°€λŠ₯ν•˜λ‚˜ μ‚­μ œ κΆŒν•œμ΄ μ—†λŠ” 경우 

 

 

728x90