| name | mutate4java |
| description | Use when the user asks to run mutation testing on a Java file, check test quality by mutating code,
find surviving mutants, kill mutants with tests, or says "๋ฎคํ
์ด์
ํ
์คํธ", "mutate", "๋ฎคํดํธ ์ก๊ธฐ",
"์ด์๋จ์ ๋ฎคํดํธ", "ํ
์คํธ๊ฐ ๋ฎคํดํธ๋ฅผ ์ก๋์ง ํ์ธ", or wants to verify that tests actually catch bugs.
Java Maven ํ๋ก์ ํธ์ ๋จ์ผ `.java` ํ์ผ์ ๋ํด mutation testing์ ์คํํ๋ ๋๊ตฌ.
|
mutate4java Skill
Java Maven ํ๋ก์ ํธ์ ๋จ์ผ .java ์์ค ํ์ผ์ mutation testing์ ์คํํ๊ณ , ์ด์๋จ์ ๋ฎคํดํธ๋ฅผ ์ฃฝ์ด๋ ํ
์คํธ๋ฅผ ์ ์ยท์์ฑํ๋ค.
๋๊ตฌ ์์น
JAR=~/git/uncle-bob/mutate4java/target/mutate4java-0.1.0-SNAPSHOT.jar
JAR์ด ์์ผ๋ฉด ๋จผ์ ๋น๋:
cd ~/git/uncle-bob/mutate4java && mvn package -DskipTests -q
๊ธฐ๋ณธ ์คํ ๋ฐฉ๋ฒ
๋์ ํ์ผ์ด ์ํ Maven ๋ชจ๋ ๋ฃจํธ์์ ์คํํด์ผ ํ๋ค (๊ฐ์ฅ ๊ฐ๊น์ด pom.xml ํ์ ๊ธฐ์ค).
java -jar $JAR src/main/java/com/example/Foo.java
java -jar $JAR src/main/java/com/example/Foo.java --scan
java -jar $JAR src/main/java/com/example/Foo.java --since-last-run
java -jar $JAR src/main/java/com/example/Bar.java --reuse-coverage
์ํฌํ๋ก์ฐ
1. ์ฒซ ์คํ (์ ๊ท ํ์ผ)
cd <module-root>
java -jar ~/git/uncle-bob/mutate4java/target/mutate4java-0.1.0-SNAPSHOT.jar \
src/main/java/com/example/Foo.java --verbose
- ๋ฒ ์ด์ค๋ผ์ธ ํ
์คํธ ์คํ + JaCoCo ์ปค๋ฒ๋ฆฌ์ง ์์ฑ
- ์ปค๋ฒ๋ ๋ฎคํ
์ด์
์ฌ์ดํธ๋ง ์คํ
- ์๋ฃ ํ ํ์ผ ๋์ manifest ์๋ ๊ธฐ๋ก
2. ๋ฐ๋ณต ์คํ (๋ณ๊ฒฝ ํ)
java -jar $JAR src/main/java/com/example/Foo.java --since-last-run
manifest๊ฐ ์์ผ๋ฉด ๋ณ๊ฒฝ๋ declaration scope๋ง ์ฌ์คํ โ ๋๊ท๋ชจ ํ์ผ์์๋ ๋น ๋ฆ.
3. ๋ฐฐ์น ์คํ (์ฌ๋ฌ ํ์ผ)
java -jar $JAR src/main/java/com/example/A.java
java -jar $JAR src/main/java/com/example/B.java --reuse-coverage
java -jar $JAR src/main/java/com/example/C.java --reuse-coverage
4. ์ด์๋จ์ ๋ฎคํดํธ ์ฒ๋ฆฌ (ํต์ฌ ์ํฌํ๋ก์ฐ)
์ถ๋ ฅ์ SURVIVED๊ฐ ์์ผ๋ฉด:
- ํด๋น ๋ผ์ธ์ ์๋ณธ ์ฝ๋์ ๋ฎคํ
์ด์
๋ด์ฉ ํ์ธ
- ์ด๋ค ์
๋ ฅ๊ฐ/์ผ์ด์ค์์ ๊ทธ ๋ณํ๊ฐ ๋๋ฌ๋๋์ง ๋ถ์
msbaek-tdd:tdd-red skill๋ก ๊ทธ ์ผ์ด์ค๋ฅผ ์ปค๋ฒํ๋ ํ
์คํธ ์์ฑ
- ํ
์คํธ ํต๊ณผ ํ ์ฌ์คํํด์ ๋ฎคํดํธ๊ฐ KILLED๋ก ๋ฐ๋๋์ง ํ์ธ
# ์ด์๋จ์ ๋ฎคํดํธ ์์
SURVIVED src/main/java/demo/Flag.java:9 replace == with !=
โ line 9์ == ์กฐ๊ฑด์ด !=์ผ๋ก ๋ฐ๋์ด๋ ๊ธฐ์กด ํ
์คํธ๊ฐ ๊ฐ์ง ๋ชปํจ
โ ==์ !=๋ฅผ ๊ตฌ๋ถํ๋ ๊ฒฝ๊ณ๊ฐ ํ
์คํธ ์ผ์ด์ค ์ถ๊ฐ ํ์
์ถ๋ ฅ ํด์
| ๊ฒฐ๊ณผ | ์๋ฏธ | ์ก์
|
|---|
KILLED | ํ
์คํธ๊ฐ ๋ฎคํดํธ ์ก์ โ
| ์์ |
SURVIVED | ํ
์คํธ๊ฐ ๋ฎคํดํธ ๋ชป ์ก์ โ | ์ ํ
์คํธ ์์ฑ |
UNCOVERED | ์ปค๋ฒ๋ฆฌ์ง ๋ฏธ๋ฌ ๋ผ์ธ โ ์คํ ์ ํจ | ์ปค๋ฒ ํ
์คํธ ์ถ๊ฐ |
TIMEOUT | ํ์์์ โ killed ์ฒ๋ฆฌ๋จ | ์์ |
์ฃผ์ ์ต์
| ์ต์
| ์ฉ๋ |
|---|
--scan | ํ
์คํธ ๋ฏธ์คํ, ๋ฎคํ
์ด์
์ฌ์ดํธ๋ง ๋ชฉ๋ก ์ถ๋ ฅ |
--since-last-run | ๋ณ๊ฒฝ๋ scope๋ง ์คํ (manifest ํ์) |
--mutate-all | manifest ๋ฌด์ํ๊ณ ์ ์ฒด ์คํ |
--reuse-coverage | ๊ธฐ์กด JaCoCo XML ์ฌ์ฌ์ฉ |
--lines 12,18 | ํน์ ๋ผ์ธ๋ง ๋ฎคํ
์ด์
|
--update-manifest | ํ
์คํธ ์คํ ์์ด manifest๋ง ๊ฐฑ์ |
--max-workers N | ๋ณ๋ ฌ ์์ปค ์ ์ ํ (๊ธฐ๋ณธ: CPU/2) |
--verbose | ์์ปค๋ณ ์งํ ์ํฉ ์ค์๊ฐ ์ถ๋ ฅ |
--test-command CMD | ๊ธฐ๋ณธ mvn test ๋์ ์ปค์คํ
๋ช
๋ น ์ฌ์ฉ |
Exit Codes
| Code | ์๋ฏธ |
|---|
| 0 | ์ฑ๊ณต (๋ชจ๋ ๋ฎคํดํธ killed, ๋๋ ์คํํ ๋ฎคํดํธ ์์) |
| 1 | CLI ์ฌ์ฉ ์ค๋ฅ |
| 2 | ๋ฒ ์ด์ค๋ผ์ธ ํ
์คํธ ์คํจ |
| 3 | ์ด์๋จ์ ๋ฎคํดํธ ์์ |
์ง์ ๋ฎคํ
์ด์
๋ชฉ๋ก
- boolean ๋ฆฌํฐ๋ด:
true โ false
- ๋น๊ต ์ฐ์ฐ์:
==, !=, <, <=, >, >=
- ์ฐ์ ์ฐ์ฐ์:
+ โ -, * โ /
- ๋
ผ๋ฆฌ ์ฐ์ฐ์:
&& โ ||
- ๋จํญ ์ฐ์ฐ์:
!expr โ expr, -expr โ expr
- ์ ์ ์์:
0 โ 1
- ์ฐธ์กฐ rvalue โ
null
์ฃผ์์ฌํญ
- ํ์ผ ํ๋์ฉ๋ง ๋์์ผ๋ก ํจ (๋๋ ํ ๋ฆฌ ์ ์ฒด ์ง์ ์ ํจ)
- Maven ํ๋ก์ ํธ ์ ์ฉ
- ํ
์คํธ ์์ค๋ ๋ฎคํ
์ด์
๋์ ์๋
--scan๊ณผ --since-last-run ์กฐํฉ ๋ถ๊ฐ (์ถฉ๋ ์ต์
๋ง์ โ README ์ฐธ์กฐ)
๊ด๋ จ ์คํฌ
- ์ด์๋จ์ ๋ฎคํดํธ โ ํ
์คํธ ์์ฑ:
msbaek-tdd:tdd-red โ msbaek-tdd:tdd-green
- ์ฝ๋ ๋ณต์ก๋ ๋ถ์:
crap4java