JUnit

์ฝœ๋ผ๋ง˜ยท2023๋…„ 7์›” 3์ผ
0

Spring

๋ชฉ๋ก ๋ณด๊ธฐ
3/14
post-thumbnail

๐Ÿ€ JUnit

  • ์ž๋ฐ”์˜ ๋‹จ์œ„ํ…Œ์ŠคํŠธ์šฉ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
  • ์Šคํ”„๋ง ํ”„๋กœ์ ํŠธ ๋ฐฐํฌ์‹œ ์ž‘์„ฑ๋˜์–ด์žˆ๋Š” ๋ชจ๋“  ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋ฅผ ํ†ต๊ณผํ•ด์•ผ ๋ฐฐํฌ๋ฅผ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค
  • ๊ธฐ๋ณธ ๋ฒ„์ „์€ ๋„ˆ๋ฌด ์˜›๋‚  ๊ฒƒ์ด๋ฏ€๋กœ pom.xml์—์„œ ๋ฒ„๋˜์„ ์ˆ˜์ •ํ•œ ํ›„ ์‚ฌ์šฉ

๐ŸŒผ JUnit ๋ฒ„์ „ ์—…๋ฐ์ดํŠธ ํ•˜๊ธฐ

  1. JUnit ๋ฒ„์ „ ์—…๋ฐ์ดํŠธ ํด๋ฆญ ํ›„ Maven์— ์žˆ๋Š” ๊ฐ’ ๋ณต์‚ฌ
  2. pom.xml์˜ dependendy์—์„œ junit์ฐพ๊ธฐ
  3. ํ•ด๋‹น ๋ถ€๋ถ„์— ๋ณต์‚ฌํ•œ ๋‚ด์šฉ ๋ถ™์—ฌ๋„ฃ๊ธฐ

๐ŸŒผ JUnit์˜ ์–ด๋…ธํ…Œ์ด์…˜๋“ค

  • @Test : ํ•ด๋‹น ๋ฉ”์„œ๋“œ๊ฐ€ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ์ž„์„ ํ‘œ์‹œํ•˜๋Š” ์–ด๋…ธํ…Œ์ด์…˜
  • @Ignore : ํ•ด๋‹น ํ…Œ์ŠคํŠธ๋ฅผ ๋ฌด์‹œํ•œ๋‹ค
  • @Before : ํ…Œ์ŠคํŠธ ์‹œ์ž‘ ์ „ ์‹คํ–‰ํ•˜๋Š” ๋ฉ”์„œ๋“œ, ํ…Œ์ŠคํŠธ ์ „์— ์ดˆ๊ธฐํ™”๋“ฑ์˜ ์ž‘์—…์„ ๋จผ์ € ์ˆ˜ํ–‰ํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค
  • @After : ํ…Œ์ŠคํŠธ ์ข…๋ฃŒ ํ›„ ์‹คํ–‰ํ•˜๋Š” ๋ฉ”์„œ๋“œ, close()๋“ฑ์˜ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค

๐ŸŒผ JUnit Asserts

  • ๊ธฐ๋Œ€ํ•˜๋˜ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜ค๋ฉด ํ…Œ์ŠคํŠธ๋ฅผ ํ†ต๊ณผํ•˜๊ณ , ๊ธฐ๋Œ€ํ•˜๋˜ ๊ฐ’๊ณผ ๊ฒฐ๊ณผ๊ฐ€ ๋‹ค๋ฅด๋ฉด ํ…Œ์ŠคํŠธ์— ์‹คํŒจํ•œ๋‹ค
  • assertEquals(expect, test) : ๊ธฐ๋Œ€ํ•˜๋˜ ๊ฐ’๊ณผ ๊ฒฐ๊ณผ๊ฐ€ ์ผ์น˜ํ•˜๋ฉด ํ…Œ์ŠคํŠธ ํ†ต๊ณผ
  • assertTrue(test) : ๊ฒฐ๊ณผ๊ฐ€ true๋ฉด ํ…Œ์ŠคํŠธ ํ†ต๊ณผ
  • assertFalse(test) : ๊ฒฐ๊ณผ๊ฐ€ false๋ฉด ํ…Œ์ŠคํŠธ ํ†ต๊ณผ
  • assertNull(test) : ๊ฒฐ๊ณผ๊ฐ€ null์ด๋ฉด ํ…Œ์ŠคํŠธ ํ†ต๊ณผ
  • assertNotNull(test) : ๊ฒฐ๊ณผ๊ฐ€ null์ด ์•„๋‹ˆ๋ฉด ํ…Œ์ŠคํŠธ ํ†ต๊ณผ
  • assertThrows(expect, test) : ์‹คํ–‰ ๋„์ค‘ ์›ํ•˜๋Š” ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ํ…Œ์ŠคํŠธ ํ†ต๊ณผ
  • fail() : fail()์„ ๋งŒ๋‚˜๋ฉด ํ…Œ์ŠคํŠธ ์‹คํŒจ (ํ…Œ์ŠคํŠธ ๋‚ด๋ถ€์—์„œ return ๊ฐ™์€ ์—ญํ• ์„ ํ•œ๋‹ค)

์‹ฑ๊ธ€ํ†ค(Singleton) ํŒจํ„ด

  • ๊ฐ์ฒด ๋‚ด์—์„œ ๋‹จ ํ•˜๋‚˜์˜ ์ธ์Šคํ„ด์Šค๋งŒ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ฒƒ์ด ๋ณด์žฅ๋˜๋Š” ๋””์ž์ธ ํŒจํ„ด
  • ์ฃผ๋กœ ํ”„๋กœ๊ทธ๋žจ ๋‚ด์—์„œ ํ•˜๋‚˜๋กœ ๊ณต์œ ๋ฅผ ํ•ด์•ผํ•˜๋Š” ๊ฐ์ฒด๊ฐ€ ์กด์žฌํ•  ๋•Œ ํ•ด๋‹น ๊ฐ์ฒด๋ฅผ ์‹ฑ๊ธ€ํ†ค์œผ๋กœ ๊ตฌํ˜„ํ•˜์—ฌ ๋ชจ๋“  ์œ ์ € ๋˜๋Š” ํ”„๋กœ๊ทธ๋žจ๋“ค์ด ํ•ด๋‹น ๊ฐ์ฒด๋ฅผ ๊ณต์œ ํ•˜๋ฉฐ ์‚ฌ์šฉํ•˜๋„๋ก ํ• ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค

๐Ÿ€ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ (Unit test)

  • ์–ด๋–ค ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•œ ํ›„ ํ•ด๋‹น ๊ธฐ๋Šฅ์ด ์›ํ•˜๋Š” ๋Œ€๋กœ ๋™์ž‘ํ•˜๋Š”์ง€ ๋ณด๊ธฐ ์œ„ํ•ด ์ž‘์„ฑํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ
  • ํ…Œ์ŠคํŠธ ์ค‘ ๊ฐ€์žฅ ์ž‘์€ ๋‹จ์œ„์˜ ํ…Œ์ŠคํŠธ์— ์†ํ•œ๋‹ค
  • ์–ด๋–ค ๋ฉ”์„œ๋“œ๋ฅผ ์‹คํ–‰ํ–ˆ์„ ๋•Œ ๊ธฐ๋Œ€ํ•˜๋Š” ๊ฐ’์ด ์ž˜ ๋‚˜์˜ค๋Š”์ง€ ์ฒดํฌํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ง„ํ–‰

๐Ÿ€ TDD(Test Driven Development, ํ…Œ์ŠคํŠธ ์ฃผ๋„ ๊ฐœ๋ฐœ)

  • ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ํ…Œ์ŠคํŠธ ํ”„๋กœ๊ทธ๋žจ์„ ๋จผ์ € ์ž‘์„ฑํ•œ ํ›„ ํ•ด๋‹น ํ…Œ์ŠคํŠธ๋ฅผ ํ†ต๊ณผํ•˜๋Š” ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ์‹์˜ ๊ฐœ๋ฐœ(ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค์™€ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ๋จผ์ € ์ž‘์„ฑ)
  • ํ…Œ์ŠคํŠธ ๋‹จ์œ„๋กœ ๊ธฐ๋Šฅ์ด ๊ตฌํ˜„๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋”์šฑ ๊ฐ์ฒด์ง€ํ–ฅ์ ์ธ ๊ฐœ๋ฐœ์ด ๊ฐ€๋Šฅํ•ด์ง„๋‹ค
  • ์œ ์ง€๋ณด์ˆ˜(๋ฆฌํŒฉํ† ๋ง)์ด ์šฉ์ดํ•ด์ง„๋‹ค
  • ์ต์ˆ™ํ•˜์ง€ ์•Š์œผ๋ฉด ์‹œ๊ฐ„์ด ๋„ˆ๋ฌด ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๊ธฐ ๋•Œ๋ฌธ์— ์ƒ์‚ฐ์„ฑ์ด ์ €ํ•˜๋œ๋‹ค (์ƒ์‚ฐ ๋น„์šฉ ์ฆ๊ฐ€)

๐Ÿ€ Jnuit ๋‹จ์œ„ํ…Œ์ŠคํŠธ ๋ฐฉ๋ฒ•

  1. src/main/java ํด๋”์— ํŒจํ‚ค์ง€์™€ ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ ๋‹ค
  2. ํด๋ž˜์Šค ์•ˆ์— ๋งŒ๋“ค๊ณ  ์‹ถ์€ ๊ธฐ๋Šฅ์„ ์ž‘์„ฑํ•œ๋‹ค
  3. src/test/java ํด๋”์— ๊ฐ™์€ ์ด๋ฆ„์˜ ํŒจํ‚ค์ง€๋ฅผ ๋งŒ๋“  ํ›„ ์šฐํด๋ฆญํ•˜์—ฌ JUnit Test Case ์ƒ์„ฑ
  4. test ๋ฉ”์„œ๋“œ ์•ˆ์— assertEquals(๊ธฐ๋Œ€ํ•˜๋Š” ๊ฐ’, ๋‚ด๊ฐ€ ์ƒ์„ฑํ•œ ํด๋ž˜์Šค.๋ฉ”์„œ๋“œ(๋งค๊ฐœ๊ฐ’) ์ „๋‹ฌ
  5. ์šฐํด๋ฆญ -> Run As -> JUnit Test ์‹คํ–‰

๐ŸŒผ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ ์‹คํ–‰

โœ” MyStringBuilder.java

package com.ezen.springmvc.common;

public class MyStringBuilder {
	public static String reverse(String str) {
		str = new StringBuilder(str).reverse().toString();
		return str;
	}
}

โœ” MyTest.java

package com.ezen.springmvc.common;
public class MyTest {
	@Test
	public void test1() {
		assertEquals("elppa", MyStringBuilder.reverse("apple")); // ๋‹ค๋ฅธ ํด๋”์— ์žˆ์ง€๋งŒ ๊ฐ™์€ ํŒจํ‚ค์ง€์ด๊ธฐ ๋•Œ๋ฌธ์— import๊ฐ€ ํ•„์š”์—†๋‹ค
		// ๊ธฐ๋Œ€ํ•˜๋Š” ๊ฐ’์„ ์“ฐ๊ณ  ํ…Œ์ŠคํŠธ ํ•  ์œ ๋‹›์„ ์ „๋‹ฌ
	}
}

๐Ÿ“บ ์‹คํ–‰ ๊ฒฐ๊ณผ >>


๐Ÿ€ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ์—์„œ Autowired ์‚ฌ์šฉํ•˜๊ธฐ

  • Autowired๋Š” ์„œ๋ฒ„๊ฐ€ ์ผœ์งˆ ๋•Œ ์‹คํ–‰๋˜๊ธฐ ๋•Œ๋ฌธ์— ์„œ๋ฒ„๋ฅผ ํ†ตํ•˜์ง€ ์•Š๋Š” ๋‹จ์œ„ํ…Œ์ŠคํŠธ์—์„œ๋Š” ์‚ฌ์šฉ์ด ๋ถˆ๊ฐ€ํ•˜๋‹ค
  • ๋‹จ์œ„ํ…Œ์ŠคํŠธ์—์„œ Autowired๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” spring context์™€ spring testContext์˜ ๋ฒ„์ „์„ ์—…๋ฐ์ดํŠธ ํ•ด์•ผํ•œ๋‹ค

์™€ spring test context๋ฅผ release๋ฒ„์ „์œผ๋กœ ์—…๋ฐ์ดํŠธ ํ•˜๊ณ  ๋‹ค์Œ ๋‚ด์šฉ์„ ์ถ”๊ฐ€
@RunWith(SpringRunner.class) @ContextConfiguration("file:src/main/webapp/WEB-INF/spring/appServlet/servlet-context.xml")

  • ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค์— ํ…Œ์ŠคํŠธ ํ•  ํด๋ž˜์Šค๋ฅผ ์„ ์–ธํ•œ ๋’ค @Autowired๋ฅผ ๋ถ™์ด๋ฉด @Component ์–ด๋…ธํ…Œ์ด์…˜์„ ๋ถ™์ธ ์œ ๋‹›์„ ์ฐพ์•„์„œ ์•Œ์•„์„œ ์‹คํ–‰ํ•ด์ค€๋‹ค

๐ŸŒผ pom.xml์—์„œ ์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ ๋ฒ„์ „ ์—…๋ฐ์ดํŠธ ํ•˜๊ธฐ

  • spring context์—์„œ Maven์„ ๋ณต์‚ฌํ•œ ํ›„ <dependencies>์˜ <dependency>์— ๋ถ™์—ฌ๋„ฃ๊ธฐ
  • spring context์™€ ๊ฐ™์€ ๋ฒ„์ „์˜ spring test context๋ฅผ ๋ณต์‚ฌํ•˜์—ฌ <dependencies>์— ์ถ”๊ฐ€
  • <properties>์˜ <java-version>์„ 1.8๋กœ ๋ณ€๊ฒฝ ํ›„ <configuration>์˜ <source>์™€ <target>์„ ์•ž์—์„œ ์„ค์ •ํ•œ ๋ณ€์ˆ˜๋ช…(${java-version}์œผ๋กœ ๋ณ€๊ฒฝ)
  • ํ•ด๋‹น ํ”„๋กœ์ ํŠธ ์šฐํด๋ฆญ -> Maven -> Update Project ... ์‹คํ–‰

MyReducer.java (์ธํ„ฐํŽ˜์ด์Šค)

@RunWith(SpringRunner.class)
@ContextConfiguration("file:src/main/webapp/WEB-INF/spring/appServlet/servlet-context.xml")

MyReducer_Impl.java (๊ตฌํ˜„์ฒด)

@Component
public class MyReducer_Impl implements MyReducer {
	@Override
	public Integer reduce(Integer[] arr) {
		int sum = 0;
		for(Integer i : arr) {
			sum += i == null ? 0 : 1;
		}
		return sum;
	}
}

MyReducerTest.java (ํ…Œ์ŠคํŠธ์ผ€์ด์Šค)

@RunWith(SpringRunner.class)
@ContextConfiguration("file:src/main/webapp/WEB-INF/spring/appServlet/servlet-context.xml")
public class MyReducerTest {
	@Autowired
	MyReducer reducer;
	
	@Before
	public void test0() {
		System.out.println(reducer);
	}
	@Test
	public void test1() {
		assertEquals(Integer.valueOf(150), reducer.reduce(new Integer[] {10,20,30,40,50}));
	}
	@Test
	public void test2() {
		assertEquals(Integer.valueOf(120), reducer.reduce(new Integer[] {10,20,null,40,50}));
	}
	@Test
	public void test3() {
		assertEquals(Integer.valueOf(0), reducer.reduce(new Integer[] {null, null, null}));
	}
}
profile
์ฝœ๋ผ๋ง˜ ์ฝ”๋”ฉ์ผ๊ธฐ

0๊ฐœ์˜ ๋Œ“๊ธ€