#!/bin/bash # 参数检查 if [ $# -ne 1 ]; then echo "Usage: $0 " exit 1 fi # 接受命令行参数作为目标语言 target_language="$1" # 定义目录 coverage_dir="coverage" statement_coverage_file="$coverage_dir/statement_coverage.out" statement_coverage_text_file="$coverage_dir/statement_coverage.txt" comment_coverage_file="$coverage_dir/comment_coverage.txt" # 创建 coverage 文件夹 mkdir -p "$coverage_dir" # 计算代码注释率 echo -e "\033[0;32mStart calculating comment coverage...\033[0m" cloc . --out=$comment_coverage_file --exclude-dir=mira_grpc,tests # 模糊匹配目标语言的行 language_line=$(awk -v target="$target_language" 'index(tolower($0), tolower(target)) {print $0}' "$comment_coverage_file") # 提取comment和code的值,使用第三个和第四个数字作为关键 comment=$(echo "$language_line" | awk '{for (i=1; i<=NF; i++) if ($i ~ /^[0-9]/) {count++; if (count == 3) {print $i; break}}}') code=$(echo "$language_line" | awk '{for (i=1; i<=NF; i++) if ($i ~ /^[0-9]/) {count++; if (count == 4) {print $i; break}}}') if [[ -n "$comment" && -n "$code" ]]; then # 计算comment/code的百分比 percentage=$(awk "BEGIN { printf \"%.2f\", ($comment / $code) * 100 }") echo -e "\033[0;31mComment Coverage is $percentage%\033[0m" else echo -e "\033[0;31m错误:无法提取 $target_language 语言的注释和代码值。\033[0m" fi # 如果目标语言是 Python: if [ "$target_language" = "python" ]; then echo -e "\033[0;32mStart calculating test coverage for Python...\033[0m" echo -e "\033[0;33m请将coverstas放在和requirements.txt同级目录或根目录下\033[0m" # 获取当前路径 current_path=$(pwd) # 检查当前路径是否包含"kms" if [[ "$current_path" == *"kms"* ]]; then if ! coverage run -m pytest src/; then echo -e "\033[0;31mError: Failed to calculate Python Test Coverage\033[0m" exit 1 fi fi # 检查当前路径是否包含"engine" if [[ "$current_path" == *"code"* ]]; then # 回退到上一级目录 # 执行测试覆盖率计算 if ! coverage run -m pytest tests/; then echo -e "\033[0;31mError: Failed to calculate Python Test Coverage for mira-mpc-engine\033[0m" exit 1 fi fi # 生成测试覆盖率报告 coverage report -m --omit="/usr/local/lib/python*/dist-packages/*" echo -e "\033[0;31mPython Test Coverage Calculated\033[0m" fi # 如果目标语言是 Go: if [ "$target_language" = "go" ]; then echo -e "\033[0;32mStart calculating test coverage for Go...\033[0m" echo -e "\033[0;33m请将coverstas放在和go.mod同级目录下\033[0m" go test -coverprofile="$statement_coverage_file" ./... go tool cover -func="$statement_coverage_file" -o "$statement_coverage_text_file" # 提取total行并提取括号内的覆盖率 coverage_percentage=$(awk '/total:/ {print $NF}' "$statement_coverage_text_file") # 输出结果 echo -e "\033[0;31mUT Statements Coverage is: ${coverage_percentage}\033[0m" fi # 如果目标语言是 Java: if [ "$target_language" = "java" ]; then echo -e "\033[0;32mStart calculating test coverage for Java...\033[0m" echo -e "\033[0;33m请将coverstas放在和pom.xml同级目录或根目录下\033[0m" mvn clean test jacoco:report # 获取测试覆盖率信息 coverage_percentage=$(grep -o 'Total.*' target/jacoco-reports/index.html | grep -o '[0-9]*%' | head -n 1) # 输出测试覆盖率信息 echo -e "\033[0;31mUT Statements Coverage is: ${coverage_percentage}\033[0m" fi