JUnit์ ์ฌ์ฉํ์ฌ BigDecimal ๊ฐ์ ํ ์คํธํ๋ ๊ฒ์ ํญ์ ๊ณจ์นซ๊ฑฐ๋ฆฌ์ ๋๋ค. BigDecimal์ด equals()๋ฅผ ์ฌ์ฉํ์ฌ ์ ๋ฐ๋๋ฅผ ๊ณ ๋ คํ์ง๋ง compareTo()์์๋ ์ด๋ฅผ ๋ฌด์ํ๊ธฐ ๋๋ฌธ์ ๋๋ค. ์ด๋ฅผ ์ฒ๋ฆฌํ๋ ๊ฐ์ฅ ์ข์ ๋ฐฉ๋ฒ์ ์ ๋ฐ๋๋ฅผ ์ ํ์ ์ผ๋ก ํ๊ฐํ ์ ์๋ ์๋ก์ด assertEquals ๋ฉ์๋์ ๋๋ค. ๋ฉ์์ง๋ฅผ ์๋ฝํ๋ ๋์ฒด ๋ฐฉ๋ฒ์ ์ถ๊ฐํ ์๋ ์์ต๋๋ค.
๊ณต๊ฐ ์ ์ ๋ฌดํจ assertEquals(BigDecimal ์์, BigDecimal ์ค์ , ๋ถ์ธ PrecisionMatters) {
if (์ ๋ฐ๋) {
Assert.assertEquals(์์, ์ค์ );
} ๋ ๋ค๋ฅธ {
Assert.assertEquals(0, expected.compareTo(์ค์ ));
}
}
ํฌํฌ๋ ํจ์น๋ก ์ฝ๊ฒ ๊ฒฐํฉํ ์ ์์ต๋๋ค. ์ ์ ํ๋ค๋ฉด ๊ธฐ๊บผ์ด ํ๊ฒ ๋ค.
assertEquals์ ๋ถ์ธ ํ๋๊ทธ๋ฅผ ์ ๋ฌํ๋ ๊ฒ๋ณด๋ค assertNumericallyEqualTo ์ด์ค์ ์ ์ฌ์ฉํ๊ณ ์ถ์ต๋๋ค.
์ข์ ์ด๋ฆ์ ๋๋ค. assertNumericallyEquals()๋ก ์ค์ด๊ฒ ์ต๋๋ค.
๋๋ ๊ทธ ์๊ฒฌ์ ๋์ํ์ง๋ง ๋ค๋ฅธ ์ด๋ฆ์ ๊ฐ์ง ๋ค๋ฅธ assert ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ํนํ ์ฐจ์ด์ ์ ์์ ํ ์์ง ๋ชปํ๊ฑฐ๋ ๋ฌธ์ ๋ฅผ ์ง์ ๊ฒฝํํ์ง ์์ ์ฌ๋๋ค ์ฌ์ด์์ ํผ๋์ ํด๊ฒฐํ๋ ๋ฐ ์ค์ ๋ก ๋์์ด ๋ ์ง ํ์ ํ ์ ์์ต๋๋ค. ๋ด ๋ง์, ์ด ๋ฌธ์ ๋ฅผ ์ฝ์ง ์์๋ค๋ฉด assertEquals()
๋ํด BigDecimal
assertEquals()
๋ฅผ ์ฌ์ฉํ์ ๊ฒ์
๋๋ค. ์ผ๋ฐ์ ์ธ ๊ฒฝ์ฐ ์ค์ ๋ก ๊ด๊ณ ํ ๋๋ก ์๋ํฉ๋๋ค. BigDecimal#equals()
์๋ ๋ฐฉ์๊ณผ ์ ํํ ์ผ์นํฉ๋๋ค. ๋๋ ์ด๊ฒ์ด ์ข์ ์ผ์ด๋ผ๊ณ ์ฃผ์ฅํ๊ธฐ๋ ํฉ๋๋ค. ๋๊ตฐ๊ฐ BigDecimal#equals()
๊ฐ์น์ ๊ท๋ชจ๋ฅผ ๋ชจ๋ ๋น๊ตํ๋ค๋ ์ฌ์ค์ ๊นจ๋ซ๊ฒ ๋๋ค๋ฉด ๊ทธ๊ฒ์ด ๊ทธ๋ค์ด ์ฑ์ทจํ๋ ค๊ณ ํ๋ ๊ฒ์ด ์๋ ์๋ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๋ค๋ฅธ ๊ฒฝ์ฐ์๋ ๊ทธ๋ ๊ฒ ์๊ฐํฉ๋๋ค. _์ด๋ค_. ๋ด ๋ง์, ์ด๋ค ๊ฒฝ์ฐ์๋ ๋ฉ์๋์์ ๋ฐํ๋ ์ค์ ๊ฐ์ด ์์ ๊ฐ๊ณผ _์ ํํ_ '๋์ผ'ํ์ง ํ์ธํ๋ ค๋ ๊ฒฝ์ฐ๊ฐ ์์ต๋๋ค(๋
ผ๋ฆฌ์ ์ผ๋ก/์ซ์์ ์ผ๋ก๋ง ๋์ผํ ๊ฒ์ด ์๋). ๋ค๋ฅธ ์์ผ๋ก ๋งํ๋ฉด assertEquals(0, actual.compareTo(expected))
๊ฐ ์ ๊ณตํ์ง ์๋ assertNumericallyEquals()
๊ฐ (๊ฐ๊ฒฐํจ์ ์ ์ธํ๊ณ ) ๋ฌด์์ ์ ๊ณตํฉ๋๊น? ๊ฐ์ธ์ ์ผ๋ก ์ ๋ Hamcrest ๋งค์ฒ๋ฅผ ๋ง๋ค๊ณ ์์ฃผ ํ์ํ ๊ฒฝ์ฐ assertThat(actual, isNumericallyEqualTo(expected))
๋ก ์ด๋ํ ๊ฒ์
๋๋ค. ๊ฒ๋ค๊ฐ Hamcrest ๋งค์ฒ๋ฅผ ์ฌ์ฉํ ์ ์๋ ๋ชจ๋ ๊ณณ์์ ์ฌ์ฉํ ์ ์์ต๋๋ค(ํนํ ๋ฐ์ดํฐ ์ ํจ์ฑ ๊ฒ์ฌ).
๋ฆ์ ์ฒด์ค ์ธก์ ์ ๋ํด ์ฃ์กํ์ง๋ง ์ ๊ฐ์ธ์ ์ธ ์๊ฒฌ์ Alistair์ ๊ฐ๊น์ต๋๋ค.
๋ค๋ฅด๊ฒ ํํํ์๋ฉด
assertNumericallyEquals()
๋assertEquals(0, actual.compareTo(expected))
๊ฐ ์ ๊ณตํ์ง ์๋ (๊ฐ๊ฒฐํจ์ ์ ์ธํ๊ณ ) ๋ฌด์์ ์ ๊ณตํฉ๋๊น?
์๋๋ฅผ ๋ ๋ช ํํ๊ฒ ์ ๋ฌํฉ๋๊น? hamcrest matcher ์ ๊ทผ ๋ฐฉ์์ ์ ์๊ฒ ์ข์ต๋๋ค.
์ ํ๋ฆฌ,
์์ ์ ํ๋ก์ ํธ๋ฅผ ์ํด ๊ทธ matcher๋ฅผ ์ ์์ฑํ๊ณ ์๋ค๋ ๋ง์ ๋๊น, ์๋๋ฉด hamcrest์ ํจ๊ป ์ ๊ณต๋๊ธฐ๋ฅผ ์ํ์ญ๋๊น? ๋๋ JUnit์ด ์์ง๋ง ํํฌ๋ ์คํธ๋ ์๋๊ฐ์?
์์ ์ผ๋ถ ๋๋ ๋ชจ๋ -- ๋ด๊ฐ ์์ฑํ๋ ๋๋ถ๋ถ์ ํ๋ก์ ํธ๋ ๊ฒฐ๊ตญ ์ผ๋ถ ์ฌ์ฉ์ ์ง์ ํํฌ๋ ์คํธ ๋งค์ฒ๋ฅผ ๊ฐ๊ฒ ๋ฉ๋๋ค. Hamcrest ๋ฐ/๋๋ JUnit์ผ๋ก ์ผ๋ฐ์ ์ธ ๊ฒฝ์ฐ๋ฅผ ์ฒ๋ฆฌํ๋ฉด ์๊ฐ์ด ์กฐ๊ธ ์ ์ฝ๋์ง๋ง ์ด๊ฒ์ ์ ์๊ฒ ๊ทธ๋ค์ง ํํ ๊ฒฝ์ฐ๋ ์๋๋๋ค.
๋ ์ ์ฉํ ์ค๋ฅ ๋ฉ์์ง์ ๋ํ ์์ ์์ . BigDecimal์ Assert.assertEquals์ ๋น๊ตํ๋ ๋ฐ ์คํจํ์ฌ Assert.assertEquals ํธ์ถ์ Assert.assertTrue๋ก ๋ณํํ์ต๋๋ค. ๋ฌผ๋ก ์ด์ ๋ด ํ ์คํธ๋ ๊ฐ์ด ๋ฌด์์ธ์ง ์๋ ค์ฃผ์ง ์๊ณ ์ผ์ข ์ "๋ถ์ธ ํ ์คํธ ์คํจ" ์ค๋ฅ์ ํจ๊ป ์คํจํฉ๋๋ค. ๊ฐ์ ๋ฐฉ์์ผ๋ก assertEquals(0, actual.compareTo(expected))๋ ํจ์ฌ ๋ ์ ์ฉํ ์ค๋ฅ ๋ฉ์์ง๊ฐ assertNumericallyEquals(actual, expected)์์ "12.45๋ฅผ ์์ํ์ง๋ง : 123"('์ค์ ' ๋ฐ '์์' ์ธ์์ ์ค์ ๊ฐ).
http://www.bssd.eu/blog/?p=113 ๋ ํฅ๋ฏธ๋กญ๊ฒ ์ฝ์ ์ ์์ต๋๋ค.
https://github.com/KentBeck/junit/pull/228์ assertEquivalent๊ฐ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํด์ผ ํฉ๋๋ค.
๊ฐ์ฌํฉ๋๋ค. ๊ทธ ์ํ์ ๋ฉ์ ธ ๋ณด์ธ๋ค. ๋๋ ์ ์ ์ด๊ฒ์ ํด๋ณธ ์ ์ด ์๋๋ฐ, ์ด๊ฒ์ ๋ด๊ฐ junit ์์ค๋ฅผ ๊ฐ์ ธ์์ผ ํ๊ณ , ์ด pull ์์ฒญ์ ์ง์ ๋ณํฉํ๊ณ , ์ฌ์ฉ์ ์ ์ ๋น๋๋ฅผ ๋ง๋ค์ด์ผ ํ๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๊น?
http://help.github.com/send-pull-requests/ ์ ๋์๋ง์์ ๋ค์๊ณผ ๊ฐ์ด ํด์ผ ํฉ๋๋ค.
์์ ํด๋ก https://github.com/KentBeck/junit.git
CD ์ฃผ๋ํธ
๊ทธ๋ฐ ๋ค์ pull ์์ฒญ์ ๋ํ ๋ฆฌ๋ชจ์ปจ์ ์ถ๊ฐํ ๋ค์ ๊ฐ์ ธ์ค๊ธฐ, ๋ณํฉ ๋๋ ๋ ๋ค๋ฅผ ์ํํฉ๋๋ค.
์ด๊ฒ์ด ๊ณต์ junit์ด ์๋ pull request์ธ ๊ฒ์ ๊ฐ์ํ ๋ ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ฌ์ฉํ๋ ๊ฒ์ด ํ๋ช ํฉ๋๊น? ์ด๊ฒ์ด ์ฃผ์ junit ์ธ๋ถ์์ ๋ณํ๋ ๊ฐ๋ฅ์ฑ์ด ์์ผ๋ฉฐ ๋น๋ํ์ง ์์ ๋ค๋ฅธ ์ฌ๋์๊ฒ ๋ด ์ฝ๋๋ฅผ ๋ณด๋ด๋ ๋ฐ ๋ฌธ์ ๊ฐ ์์ต๋๊น?
๋คํฌํ์ ,
๋ค, ์ง๊ธ ๋ฐฉ๋ฒ์ ๋ํด ์ฌ๋ฐ๋ฅธ ๊ธธ์ ๊ฐ๊ณ ์์ต๋๋ค. ๋๋ ๊ทธ ํ์ 4.10 ๋ธ๋์น์ ๋ณํฉํ๋ ค๊ณ ํ์ง๋ง ์๋ ์์ฑ์๋ git ์ํ๋ฅผ ๋ณํฉํ ์ ์๊ฒ ํ๋ ๋ฐ ๋ฌธ์ ๊ฐ ์์์ต๋๋ค. ์ธ์์ ํธ์๋ฅผ ๋ฒ ํ ์๊ฐ์ด ์๋ค๋ฉด KentBeck ๋ฆฌํฌ์งํ ๋ฆฌ๋ฅผ ํฌํฌํ๊ณ ๋ชจ๋ ๊ฒ์ ๋ณํฉํ๊ณ 4.10 ๋ธ๋์น์ ๋ํด ํ ๋ฆฌํ์คํธ๋ฅผ ๋ฐํํ์ฌ ๋ชจ๋์๊ฒ ๋ ์ฝ๊ฒ ๋ง๋ค ์ ์์ต๋๋ค. ์ธ์ ๊ฐ๋ 4.10 ๋ฏธ๋ฆฌ๋ณด๊ธฐ ๋ณ์ผ๋ก).
๋๋ ์ ๋ง๋ก ์ด๊ฒ์ ํ ์ ์ด ์์ต๋๋ค. :) ๊ทธ๋์ ๋๋ repo๋ฅผ ๋ถ๊ธฐํ๊ณ [email protected] :neekfenwick/junit.git์ ๋ด ๋ก์ปฌ ์ปดํจํฐ์ ๋ณต์
git remote add upstream https://github.com/KentBeck/junit.git
์ข์ ์ธก์ ์ ์ํด ํ ์์ฒญ์ HEAD๊ฐ ์๋ ๋ค๋ฅธ ๊ณณ์ ๋ณํฉํ ์ ์๋๋ก ๋ถ๊ธฐํ์ต๋๋ค.
git branch merge_pullreq_228
git checkout merge_pullreq_228
์ด์ ๋ด๊ฐ ์ฐพ์ ์์๋ ๋ฌธ์์๋ "์ด์ ํ ์์ฒญ์ ๋ถ๊ธฐ์ ๋ณํฉํ์ญ์์ค"๋ผ๊ณ ํ์๋ฉ๋๋ค. https://github.com/KentBeck/junit/pull/228/commits ์์ pull 228์ ๋ํ ์ปค๋ฐ์ ๋ณผ ์ ์์ง๋ง ๋ณํฉํ ์๋ ์์ต๋๋ค.
[neek junit (merge_pullreq_228)]$ git merge 57b49344
fatal: '57b49344' does not point to a commit
pull ์์ฒญ์ ๋ด ์์ ์ repo/branch์ ๋ํ ๊ฒ์ด ์๋๋ฏ๋ก github web gui(AFAIK)์์ Merge ๋๊ตฌ๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
๋ด ์์ ์ ๋ถ๊ธฐ์ 7๊ฐ์ ์ปค๋ฐ์ ๋ณํฉํ๊ณ ๋จ์ ํ ์คํธ๋ฅผ ๋น๋/ํต๊ณผํ๊ธฐ๋ฅผ ์ํ๋ค๊ณ ์๊ฐํ๋ ๊ฒ์ด ๋ง์ต๋๊น? ์ด ์ปค๋ฐ ์ค ํ๋๋ฅผ ๋ณํฉํ๊ธฐ ์ํด ๋ฌด์์ ํด์ผ ํ๋์ง ์ค๋ช ํด ์ฃผ์๊ฒ ์ต๋๊น?
๋ง์ต๋๋ค. ์น ๋ณํฉ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. ํจ๊ณผ๊ฐ ์๋ค๊ณ ์๊ฐํ๋ ๊ฒ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
์์ ์๊ฒฉ ์ถ๊ฐ leet3lite https://github.com/leet3lite/junit.git
๊ทธ๋ฐ ๋ค์ ์ง์ ์์ ์ ํํ์ญ์์ค.
git pull leet3lite ๋ง์คํฐ
๋ถํํ๋, git์ "์ ํ๋ก" ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ์ค๋ช ํ ๋ ๋ณดํต ํ ๊ฐ์ง๋ฅผ ์์ด๋ฒ๋ฆฌ๋ฏ๋ก ๊ทธ๊ฒ์ด ๋น์ ์๊ฒ ์ ํฉํ์ง ์๋ ค์ฃผ์ธ์.
์ ์๊ฒ ์ต๋๋ค. ๊ฐ ์ปค๋ฐ์ ๋ณํฉํ ํ์๊ฐ ์์ต๋๋ค. leet3lite์ ๋ง์คํฐ ๋ธ๋์น์๋ ์ด๋ฏธ ์ปค๋ฐ์ด ์์ผ๋ฉฐ ํด๋น ์์ ์ ์๋ ๋ง์คํฐ์ ๋ณํฉํ๋ ํ์๊ฐ ๋ฌธ์ ์ ๋๋ค.
ํด๋น ๋ถ๊ธฐ์ HEAD ๊ฐ์ ๋ณํฉ ์ถฉ๋์ด ์๋ ๊ฒ ๊ฐ์ต๋๋ค. ์ด๊ฒ์ด ์ด ์ด๋์ ์์ ์ธ ๊ฒ ๊ฐ์์.
[neek junit (merge_pullreq_228)]$ git remote add leet3lite https://github.com/leet3lite/junit.git
[neek junit (merge_pullreq_228)]$ git pull leet3lite master
remote: Counting objects: 100, done.
remote: Compressing objects: 100% (39/39), done.
remote: Total 85 (delta 34), reused 77 (delta 26)
Unpacking objects: 100% (85/85), done.
From https://github.com/leet3lite/junit
* branch master -> FETCH_HEAD
Auto-merging acknowledgements.txt
CONFLICT (content): Merge conflict in acknowledgements.txt
Auto-merging src/main/java/org/junit/Assert.java
Auto-merging src/test/java/org/junit/tests/AllTests.java
CONFLICT (content): Merge conflict in src/test/java/org/junit/tests/AllTests.java
Automatic merge failed; fix conflicts and then commit the result.
[neek junit (merge_pullreq_228|MERGING)]$
๊ทธ๊ฒ์ด ๋น์ ์๊ฒ ํฉ๋ฆฌ์ ์ผ๋ก ๋ณด์ธ๋ค๋ฉด, ๋๋ ๋ด์ผ ์ด๊ฒ์ ๊ณ์ํ ๊ฒ์ ๋๋ค. ๊ฑฐ์ ์์ ์ ๋๋ค.
์ฌ๋ฐ๋ฅธ ์์น์ ์๋ ๊ฒ ๊ฐ์ต๋๋ค. acknowledgements.txt ๋ฐ AllTests.java๋ ์ผ๋ฐ์ ์ผ๋ก ์ถ๊ฐ๋ก ์ธํด ๋ง์ด ์ํฅ์ ๋ฐ๊ธฐ ๋๋ฌธ์ ๋ณํฉ ์์ ์ ๋ ๊ฒฝ๋ก์ ์ถ๊ฐ๋ ๋ชจ๋ ํ์ ํฌํจํ๋ ๊ฐ๋จํ ์์ ์ผ ์ ์์ต๋๋ค.
์ถ์งํด ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค.
2๋ ์ ์ ๊ณ ์ณ์ง ๊ฒ ๊ฐ์์.
dsaff - No ...?
4.11์๋ ์์ ;( ์ด ๊ธฐ๋ฅ๋ ํ์ํฉ๋๋ค.
assertEquivalent()
์ ๋ํ ๋
ผ์๋ #228๋ก ์ฎ๊ฒจ์ก๊ณ , ๊ทธ ํ #376์ผ๋ก ์ฎ๊ฒจ์ ์ ๋ง๋ก Hamcrest๊ฐ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํด์ผ ํ๋ค๊ณ ๊ฒฐ์ ํ์ต๋๋ค.
@junit-team/junit-committers ๋ด๊ฐ ์ด๊ฒ์ ๋ซ๋ ๊ฒ์ ๋ํด ์ด์๊ฐ ์์ต๋๊น?
๋ด ์ชฝ์์ ๋ฐ๋๊ฐ ์์ต๋๋ค.
์ด๋ฐ, Freudian ํด๋ฆญ. :-) ์ฌ๊ธฐ์๋ ์ด์๊ฐ ์์ต๋๋ค.
๊ด์ฐฎ์. ๋ซ์ต๋๋ค.
hamcrest matcher๋ฅผ ์ฌ์ฉํ์ฌ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๋ค๊ณ ์๊ฐํ์ง ์์ต๋๋ค. ์๋ฅผ ๋ค์ด ๋ค์ ์ฝ๋:
assertThat(product.getRating(), is(equalTo(new BigDecimal("2.3"))));
์ด ๊ฒฐ๊ณผ๋ฅผ ์์ฑํฉ๋๋ค:
Expected: is <2.3>
but: was <2.30000>
junit ๋๋ hamcrest๋ ์ฌ์ ํ isNumericEquivalent
๋ฐฉ๋ฒ์ด ํ์ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
comparesEqualTo
์ฌ์ฉํด ๋ณด์
จ์ต๋๊น?
์, comparesEqualTo
์ค์ ๋ก ์๋ํฉ๋๋ค. ๊ฐ์ฌ ํด์.
์ผ๋ง ์ ์ ๋ง๋ ์นํธ ์ํธ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
http://www.marcphilipp.de/blog/2013/01/02/hamcrest-quick-reference/
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
comparesEqualTo
์ฌ์ฉํด ๋ณด์ จ์ต๋๊น?