TDD - showMeTheMoneyPrac/BE_Repo GitHub Wiki
Test Driven Development ์ ์ฝ์๋ก ์คํจํ๋ ํ ์คํธ๋ฅผ ๋ง๋ค๊ณ , ๊ทธ ํ ์คํธ๊ฐ ํต๊ณผํ๋ ์ฝ๋๋ฅผ ์์ฑํ๋ ๊ณผ์ ์ด๋ค.
๊ธฐํ์ด ์์ฑ๋์ง ์์ ์ํ๋ก ๊ฐ๋ฐ์ ๋ค์ด ๊ฐ๊ธฐ ๋๋ฌธ์ ์๊ตฌ์ฌํญ์ด ๋ช ํํ์ง ์์๊ณ , ์ด์ ๋ฐ๋ผ์ ์๊ตฌ ์ฌํญ ๋ณ๊ฒฝ์๋ ์ฑ๋ฅ ๊ฐ์ ์ ์ํ ๋ฆฌํฉํ ๋ง ์์ side effect๋ฅผ ๊ณ ๋ ค ํ ์ ์๊ธฐ ๋๋ฌธ์ ๋์ ํ๊ฒ ๋์๋ค.
- Test Tool๋ก๋ JUnit4๋ฅผ ์ฌ์ฉํ์๋ค.
- ์ ๋ฆฌ๋ ์๊ตฌ์ฌํญ์ ๋ฐํ์ผ๋ก ๊ฐ API ํธ์ถ์์ ์ ์ ํ ๊ฒฐ๊ณผ๊ฐ์ ์ป๋์ง๋ฅผ ๋จ์ํ ์คํธ๋ฅผ ํตํด ์ฆ๋ช ํ๋ฉฐ ๊ฐ๋ฐํ์๋ค.
- given // when // then ๋ฐฉ์์ ์ ์ฉํ์ฌ ๋ช ํํ ๋ชฉํ๋ฅผ ์ ํ๊ณ ์ฝ๋๋ฅผ ์์ฑํ์๋ค.
@RunWith(SpringRunner.class)
@SpringBootTest
@Transactional
public class CartServiceTest {
@Autowired
CartRepository cartRepository;
@Autowired
CartService cartService;
@Autowired
ProductRepository productRepository;
@Autowired
MemberRepository memberRepository;
@Autowired
ImgRepository imgRepository;
@Test
public void ์ฅ๋ฐ๊ตฌ๋_๋ด๊ธฐ_์ฑ๊ณต() throws Exception{
//given
Member member1 = new Member(
"[email protected]",
"์ ์ํ1",
"์ฐ๋ฆฌ์ง1",
"passworddd",
100000);
memberRepository.save(member1);
Member member2 = new Member(
"[email protected]",
"์ ์ํ2",
"์ฐ๋ฆฌ์ง2",
"passworddd",
0);
memberRepository.save(member2);
Product product1 = Product.builder()
.category("์นดํ
๊ณ ๋ฆฌ")
.detail("์ค๋ช
1")
.reviewCnt(0)
.price(20000)
.title("ํ์ดํ")
.build();
productRepository.save(product1);
Product product2 = Product.builder()
.category("์นดํ
๊ณ ๋ฆฌ")
.detail("์ค๋ช
2")
.reviewCnt(0)
.price(40000)
.title("ํ์ดํ2")
.build();
productRepository.save(product2);
Product product3 = Product.builder()
.category("์นดํ
๊ณ ๋ฆฌ2")
.detail("์ค๋ช
3")
.reviewCnt(0)
.price(50000)
.title("ํ์ดํ3")
.build();
productRepository.save(product3);
List<Img> imgList1 = new ArrayList<>();
Img img1 = new Img("test1",product1);
imgList1.add(img1);
imgRepository.save(img1);
List<Img> imgList2 = new ArrayList<>();
Img img2 = new Img("test2",product2);
imgList2.add(img2);
imgRepository.save(img2);
List<Img> imgList3 = new ArrayList<>();
Img img3 = new Img("test3",product3);
imgList3.add(img3);
imgRepository.save(img3);
CartRequestDto.Add dto = new CartRequestDto.Add("์ต์
",20000,3);
CartRequestDto.Add dto1 = new CartRequestDto.Add("์ต์
1",30000,1);
CartRequestDto.Add dto2 = new CartRequestDto.Add("์ต์
2",40000,2);
CartRequestDto.Add dto3 = new CartRequestDto.Add("์ต์
3",60000,4);
//when
String msg = cartService.cartAdd(member1.getNickname(),product1.getId(), dto);
String msg1 = cartService.cartAdd(member1.getNickname(),product2.getId(), dto1);
String msg2 = cartService.cartAdd(member2.getNickname(),product1.getId(), dto2);
String msg3 = cartService.cartAdd(member2.getNickname(),product3.getId(), dto3);
//then
assertEquals(msg,"msg : ๋ด๊ธฐ ์๋ฃ");
assertEquals(msg1,"msg : ๋ด๊ธฐ ์๋ฃ");
assertEquals(msg2,"msg : ๋ด๊ธฐ ์๋ฃ");
assertEquals(msg3,"msg : ๋ด๊ธฐ ์๋ฃ");
}
}
- ์ฌ์ค๊ณ ์๊ฐ์ ๋จ์ถ
-ํ ์คํธ ์ฝ๋๋ฅผ ๋จผ์ ์์ฑํ๊ธฐ ๋๋ฌธ์ ๊ฐ๋ฐ์๊ฐ ์ง๊ธ ๋ฌด์์ ํด์ผํ๋์ง ๋ถ๋ช ํ ์ ์ํ๊ณ ๊ฐ๋ฐ์ ์์ํ๊ฒ ๋๋ค. ๋ํ ํ ์คํธ ์๋๋ฆฌ์ค๋ฅผ ์์ฑํ๋ฉด์ ๋ค์ํ ์์ธ์ฌํญ์ ๋ํด ์๊ฐํด๋ณผ ์ ์๋ค. ์ฝ๋ ๋ฆฌํฉํ ๋ง์์ ํ ์คํธ ์ฝ๋๋ผ๋ ๋ฐฉํจ๋ฅผ ๊ฐ์ง๊ณ ๊ณผ๊ฐํ๊ฒ ์งํ ํ ์ ์์๋ค.
- ์ค๊ณ์ ์์ฑ๋ ์ฆ๊ฐ
-์๋๋ฆฌ์ค๋ฅผ ์์ฑํจ์ ์์ด ๋ ผ๋ฆฌ์ ์ผ๋ก ๋ถ์กฑํ ๋ถ๋ถ์ ๋ํ์ฌ ์๊ฐํ๊ณ ๋ ๋ช ํํ๊ฒ ๊ธฐ๋ฅ์ ๋ํ ์ ์๋ฅผ ํ ์ ์์๋ค.
- ๊ฐ์ฒด ์งํฅ์ ์ธ ์ฝ๋ ์์ฐ
-TDD๋ ์ฝ๋์ ์ฌ์ฌ์ฉ ๋ณด์ฅ์ ๋ช ์ํ๋ฏ๋ก TDD๋ฅผ ํตํ ์ํํธ์จ์ด ๊ฐ๋ฐ ์ ๊ธฐ๋ฅ ๋ณ ์ฒ ์ ํ ๋ชจ๋ํ๊ฐ ์ด๋ค์ง๋ค. ์ด๋ ์ข ์์ฑ๊ณผ ์์กด์ฑ์ด ๋ฎ์ ๋ชจ๋๋ก ์กฐํฉ๋ ์ํํธ์จ์ด ๊ฐ๋ฐ์ ๊ฐ๋ฅํ๊ฒ ํ๋ฉฐ ํ์์ ๋ฐ๋ผ ๋ชจ๋์ ์ถ๊ฐํ๊ฑฐ๋ ์ ๊ฑฐํด๋ ์ํํธ์จ์ด ์ ์ฒด ๊ตฌ์กฐ์ ์ํฅ์ ๋ฏธ์น์ง ์๊ฒ ๋๋ค.
- ์์ฐ์ฑ์ ์ ํ
- TDD๋ ํ ์คํธ ์ผ์ด์ค๋ฅผ ์ง๋ฉด์ ์ค์ ๊ตฌํ๋ ํด์ผ ํ๊ธฐ ๋๋ฌธ์ ๊ทธ๋งํผ์ ์ถ๊ฐ์ ์ธ ๊ฐ๋ฐ์๊ฐ์ด ์์๋๋ค๊ณ ๋ณผ ์ ์๋ค. ๋ํ ๋จ์ํ api์ ๊ฒฝ์ฐ ์ด๋์ ๋ ๊ฒฐ๊ณผ๊ฐ ์์์ด ๊ฐ๋ฅํ๋ฐ, ์ด๋ฅผ ์ํด ํ ์คํธ ์ฝ๋๋ฅผ ์ง์ผ ํ๋ ๊ฒฝ์ฐ์๋ ๋งค์ฐ ๋นํจ์จ์ ์ผ ์๋ ์๋ค.
- MockMvc ๋ฅผ ์ฌ์ฉํ์ฌ ์ข ๋ ํธ๋ฆฌํ test ํ๊ฒฝ์ ๊ตฌ์ฑ ํ ์ ์๋ค.
MockMvc๋ ์น ์ดํ๋ฆฌ์ผ์ด์
์ ์ ํ๋ฆฌ์ผ์ด์
์๋ฒ์ ๋ฐฐํฌํ์ง ์๊ณ ํ
์คํธ์ฉ MVCํ๊ฒฝ์ ๋ง๋ค์ด
์์ฒญ ๋ฐ ์ ์ก, ์๋ต๊ธฐ๋ฅ์ ์ ๊ณตํด์ฃผ๋ ์ ํธ๋ฆฌํฐ ํด๋์ค๋ค.
mockMvc์ ๋ฉ์๋
1) perform()
์์ฒญ์ ์ ์กํ๋ ์ญํ ์ ํฉ๋๋ค. ๊ฒฐ๊ณผ๋ก ResultActions ๊ฐ์ฒด๋ฅผ ๋ฐ์ผ๋ฉฐ, ResultActions ๊ฐ์ฒด๋ ๋ฆฌํด ๊ฐ์ ๊ฒ์ฆํ๊ณ ํ์ธํ ์ ์๋ andExcpect() ๋ฉ์๋๋ฅผ ์ ๊ณตํด์ค๋๋ค.
2) get("/mock/**")
HTTP ๋ฉ์๋๋ฅผ ๊ฒฐ์ ํ ์ ์์ต๋๋ค. ( get(), post(), put(), delete() )
์ธ์๋ก๋ ๊ฒฝ๋ก๋ฅผ ๋ณด๋ด์ค๋๋ค.
3) params(info)
ํค=๊ฐ์ ํ๋ผ๋ฏธํฐ๋ฅผ ์ ๋ฌํ ์ ์์ต๋๋ค.
์ฌ๋ฌ ๊ฐ์ผ ๋๋ params()๋ฅผ, ํ๋์ผ ๋์๋ param()์ ์ฌ์ฉํฉ๋๋ค.
4) andExpect()
์๋ต์ ๊ฒ์ฆํ๋ ์ญํ ์ ํฉ๋๋ค.
์ํ ์ฝ๋ ( status() )
๋ฉ์๋ ์ด๋ฆ : ์ํ์ฝ๋
isOk() : 200
isNotFound() : 404
isMethodNotAllowed() : 405
isInternalServerError() : 500
is(int status) : status ์ํ ์ฝ๋
๋ทฐ ( view() )
๋ฆฌํดํ๋ ๋ทฐ ์ด๋ฆ์ ๊ฒ์ฆํฉ๋๋ค.
ex. view().name("go") : ๋ฆฌํดํ๋ ๋ทฐ ์ด๋ฆ์ด go์ธ๊ฐ?
๋ฆฌ๋ค์ด๋ ํธ ( redirect() )
๋ฆฌ๋ค์ด๋ ํธ ์๋ต์ ๊ฒ์ฆํฉ๋๋ค.
ex. redirectUrl("/go") : '/go'๋ก ๋ฆฌ๋ค์ด๋ ํธ ๋์๋๊ฐ?
๋ชจ๋ธ ์ ๋ณด ( model() )
์ปจํธ๋กค๋ฌ์์ ์ ์ฅํ ๋ชจ๋ธ๋ค์ ์ ๋ณด ๊ฒ์ฆ
์๋ต ์ ๋ณด ๊ฒ์ฆ ( content() )
์๋ต์ ๋ํ ์ ๋ณด๋ฅผ ๊ฒ์ฆํด์ค๋๋ค.
5) andDo(print())
์์ฒญ/์๋ต ์ ์ฒด ๋ฉ์ธ์ง๋ฅผ ํ์ธํ ์ ์์ต๋๋ค.
https://wooaoe.tistory.com/33 https://mangkyu.tistory.com/182 https://shinsunyoung.tistory.com/52 https://velog.io/@jkijki12/Spring-MockMvc