導師要求:在 Linux 命令列執行 Java 單元測試類/方法。本文提供從手動 java -cp 到 Maven/Gradle 整合、再到 CI/CD 自動化的完整演進路徑。
# 1. 編譯主程式與測試碼
javac -d out -cp lib/junit-4.13.2.jar:lib/hamcrest-core-1.3.jar src/main/java/com/example/*.java src/test/java/com/example/*Test.java
# 2. 執行單一測試類 (JUnit 4)
java -cp out:lib/junit-4.13.2.jar:lib/hamcrest-core-1.3.jar org.junit.runner.JUnitCore com.example.MyClassTest
# 3. 執行單一方法
java -cp out:lib/junit-4.13.2.jar:lib/hamcrest-core-1.3.jar org.junit.runner.JUnitCore com.example.MyClassTest#testMethodName
自訂 TestExecutor (含 main) 解耦測試發現與執行邏輯:
// TestExecutor.java
public class TestExecutor {
public static void main(String[] args) {
// args[0] = 測試類全名, args[1] = 可選方法名
Request request = args.length > 1
? Request.method(Class.forName(args[0]), args[1])
: Request.aClass(Class.forName(args[0]));
new JUnitCore().run(request);
}
}
打包:jar cvfe TestExecutor.jar TestExecutor TestExecutor.class
Shell 呼叫:java -cp TestExecutor.jar:target/classes:lib/* TestExecutor com.example.MyClassTest testMethodName
| 建構工具 | 命令 | 輸出報告 |
|---|---|---|
| Maven | mvn testmvn test -Dtest=MyClassTest#testMethod | target/surefire-reports/ |
| Gradle | gradle testgradle test --tests com.example.MyClassTest.testMethod | build/reports/tests/test/index.html |
#!/bin/bash
set -e
PROJECT_DIR="/opt/myapp"
cd "$PROJECT_DIR"
# 選項解析
TEST_CLASS="${1:-}"
TEST_METHOD="${2:-}"
if [ -n "$TEST_CLASS" ]; then
mvn test -Dtest="${TEST_CLASS}${TEST_METHOD:+#$TEST_METHOD}"
else
mvn test
fi
使用:./run_tests.sh com.example.UserServiceTest testLogin
sh 'mvn test' 在 Pipeline 階段。script: - mvn test 在 .gitlab-ci.yml。run: mvn test。「java 命令只能執行含 main 方法的類。即使使用 Maven/Surefire,其入口本質仍是一個啟動類(如
JUnitCore或JUnitPlatform)透過反射發現並執行測試方法。」
:,Windows 用 ;。src/test/resources,Maven 自動複製到 target/test-classes。<parallel>classes</parallel>、JUnit 5 @Execution(CONCURRENT)。junit-platform-launcher,命令列不同:java -jar junit-platform-console-standalone.jar -c com.example.TestClass。從手動 java -cp 理解本質,再轉向建構工具標準化流程,是 Java 開發者邁向自動化測試的必經之路。