test_cnclip_service.sh 3.52 KB
#!/bin/bash

###############################################################################
# CN-CLIP 服务测试脚本
#
# 用途:
#   测试 CN-CLIP 服务的文本和图像编码功能(使用 gRPC 协议)
#
# 使用方法:
#   ./scripts/test_cnclip_service.sh [PORT]
#
# 参数:
#   PORT: 服务端口(默认:51000)
#
###############################################################################

set -e

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color

# 默认端口
PORT=${1:-51000}
GRPC_URL="grpc://localhost:${PORT}"

echo -e "${BLUE}========================================${NC}"
echo -e "${BLUE}CN-CLIP 服务测试${NC}"
echo -e "${BLUE}========================================${NC}"
echo ""
echo -e "服务地址: ${GRPC_URL} (gRPC 协议)"
echo ""

# 检查 clip_client 是否安装
if ! python3 -c "from clip_client import Client" 2>/dev/null; then
    echo -e "${RED}错误: clip_client 未安装${NC}"
    echo -e "${YELLOW}请运行: pip install clip-client${NC}"
    exit 1
fi

# 使用 Python 客户端测试(因为服务使用 gRPC 协议)
python3 << PYTHON_EOF
import sys
import numpy as np
from clip_client import Client

def test_encoding(client, test_name, inputs):
    print(f"\n{test_name}...")
    try:
        result = client.encode(inputs)
        if isinstance(result, np.ndarray):
            print(f"✓ 成功! 形状: {result.shape}")
            print(f"  输入数量: {len(inputs)}")
            print(f"  输出维度: {result.shape[1]}")
            
            # 显示每个 embedding 的维度和前20个数字
            for i in range(min(len(inputs), result.shape[0])):
                emb = result[i]
                first_20 = emb[:20].tolist()
                print(f"  Embedding[{i}] 维度: {len(emb)}")
                print(f"  前20个数字: {first_20}")
            return True
        else:
            print(f"✗ 失败: 返回类型错误: {type(result)}")
            return False
    except Exception as e:
        print(f"✗ 失败: {e}")
        import traceback
        traceback.print_exc()
        return False

# 测试
port = "${PORT}"
client = Client(f'grpc://localhost:{port}')

results = []

# 测试1: 文本编码
results.append(test_encoding(
    client,
    "测试1: 编码文本",
    ['这是一个测试文本', '另一个测试文本']
))

# 测试2: 图像编码
results.append(test_encoding(
    client,
    "测试2: 编码图像(远程 URL)",
    ['https://oss.essa.cn/98532128-cf8e-456c-9e30-6f2a5ea0c19f.jpg']
))

# 测试3: 混合编码
results.append(test_encoding(
    client,
    "测试3: 混合编码(文本和图像)",
    ['这是一段文本', 'https://oss.essa.cn/98532128-cf8e-456c-9e30-6f2a5ea0c19f.jpg']
))

# 汇总
print("\n" + "="*50)
print("测试结果汇总")
print("="*50)
print(f"总测试数: {len(results)}")
print(f"通过: {sum(results)}")
print(f"失败: {len(results) - sum(results)}")

if all(results):
    print("\n✓ 所有测试通过!")
    sys.exit(0)
else:
    print("\n✗ 部分测试失败")
    sys.exit(1)
PYTHON_EOF

TEST_RESULT=$?

if [ $TEST_RESULT -eq 0 ]; then
    echo ""
    echo -e "${GREEN}========================================${NC}"
    echo -e "${GREEN}✓ 所有测试通过!${NC}"
    echo -e "${GREEN}========================================${NC}"
else
    echo ""
    echo -e "${RED}========================================${NC}"
    echo -e "${RED}✗ 部分测试失败${NC}"
    echo -e "${RED}========================================${NC}"
    exit 1
fi