Skip to content

Commit 7e577a6

Browse files
committed
添加测试:Linux环境自动安装功能测试、Docker测试和Vagrant测试解决方案
1 parent 5207b26 commit 7e577a6

File tree

10 files changed

+965
-0
lines changed

10 files changed

+965
-0
lines changed

tests/README.md

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
# Composer SDK 测试
2+
3+
本目录包含用于测试 go-composer-sdk 功能的测试代码。
4+
5+
## 测试内容
6+
7+
测试包括:
8+
9+
1. Composer安装功能测试
10+
2. PHP项目依赖管理测试
11+
3. Linux环境自动安装测试(Docker/Vagrant)
12+
13+
## 目录结构
14+
15+
- `install/` - 测试Composer安装功能
16+
- `phpunit/` - 测试PHP单元测试和依赖管理
17+
- `docker/` - 使用Docker测试Linux环境中的功能
18+
- `vagrant/` - 使用Vagrant虚拟机测试Linux环境中的功能
19+
20+
## 运行测试
21+
22+
### 1. 安装测试
23+
24+
测试SDK自动安装Composer的功能:
25+
26+
```bash
27+
cd tests/install
28+
RUN_INSTALL_TEST=1 go run main.go
29+
```
30+
31+
### 2. PHP依赖管理和单元测试
32+
33+
测试使用Composer管理PHP项目依赖并运行PHPUnit测试:
34+
35+
```bash
36+
cd tests/phpunit
37+
RUN_COMPOSER_TESTS=1 go run main.go
38+
```
39+
40+
### 3. Linux环境测试(通过Docker)
41+
42+
测试在Linux环境中安装和使用Composer(需要Docker):
43+
44+
```bash
45+
cd tests/docker
46+
./run_tests.sh
47+
```
48+
49+
### 4. Linux环境测试(通过Vagrant)
50+
51+
如果没有Docker,可以使用Vagrant虚拟机进行测试:
52+
53+
```bash
54+
cd tests/vagrant
55+
./run_test.sh
56+
```
57+
58+
## 手动测试
59+
60+
也可以进入各个测试目录,查看README文件了解详细的手动测试步骤。
61+
62+
## 测试环境要求
63+
64+
- Go 1.20+
65+
- PHP 8.0+
66+
- Docker或Vagrant+VirtualBox(用于Linux环境测试)

tests/docker/Dockerfile

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
FROM ubuntu:22.04
2+
3+
# 避免交互式提示
4+
ENV DEBIAN_FRONTEND=noninteractive
5+
6+
# 设置时区
7+
RUN apt-get update && apt-get install -y tzdata && \
8+
ln -fs /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \
9+
dpkg-reconfigure -f noninteractive tzdata
10+
11+
# 安装基本工具
12+
RUN apt-get update && apt-get install -y \
13+
curl \
14+
wget \
15+
git \
16+
unzip \
17+
software-properties-common \
18+
apt-transport-https \
19+
ca-certificates
20+
21+
# 安装PHP
22+
RUN add-apt-repository ppa:ondrej/php && \
23+
apt-get update && \
24+
apt-get install -y php8.1 php8.1-cli php8.1-common php8.1-curl \
25+
php8.1-mbstring php8.1-xml php8.1-zip php8.1-json php8.1-opcache php8.1-readline
26+
27+
# 安装Go
28+
RUN curl -OL https://golang.org/dl/go1.20.3.linux-amd64.tar.gz && \
29+
tar -C /usr/local -xzf go1.20.3.linux-amd64.tar.gz && \
30+
rm go1.20.3.linux-amd64.tar.gz
31+
32+
# 设置Go环境变量
33+
ENV PATH=$PATH:/usr/local/go/bin
34+
ENV GOPATH=/go
35+
ENV PATH=$PATH:$GOPATH/bin
36+
37+
# 创建工作目录
38+
WORKDIR /app
39+
40+
# 复制Go模块文件
41+
COPY go.mod go.sum ./
42+
43+
# 下载依赖
44+
RUN go mod download
45+
46+
# 复制整个项目
47+
COPY . .
48+
49+
# 编译测试程序
50+
RUN cd tests/docker && go build -o /app/tests/docker/test_linux_install
51+
52+
# 设置入口点
53+
ENTRYPOINT ["/app/tests/docker/test_linux_install"]

tests/docker/README.md

Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
# Linux环境下的Composer自动安装测试
2+
3+
本目录包含用于在Linux环境中测试Composer安装功能的测试代码。
4+
5+
## 测试内容
6+
7+
测试程序会验证以下功能:
8+
9+
1. 自动安装Composer到系统路径
10+
2. 自定义安装目录安装Composer
11+
3. 创建简单PHP项目并安装依赖
12+
13+
## 使用Docker测试
14+
15+
如果您的系统上已安装Docker,可以使用Docker容器来运行测试:
16+
17+
```bash
18+
# 在项目根目录下执行
19+
cd tests/docker
20+
./run_tests.sh
21+
```
22+
23+
脚本会构建一个包含所有必要环境的Docker镜像,并在容器中运行测试。
24+
25+
## 使用Vagrant测试
26+
27+
如果没有Docker,但安装了Vagrant和VirtualBox,可以使用Vagrant创建虚拟机来运行测试:
28+
29+
```bash
30+
# 在项目根目录下执行
31+
cd tests/vagrant
32+
./run_test.sh
33+
```
34+
35+
脚本会使用Vagrant创建一个Ubuntu 22.04虚拟机,并自动安装所有必要的依赖。
36+
37+
## 手动测试
38+
39+
也可以手动测试:
40+
41+
1. 在任意Linux环境中(如Ubuntu 22.04),安装PHP:
42+
```bash
43+
sudo add-apt-repository ppa:ondrej/php
44+
sudo apt-get update
45+
sudo apt-get install -y php8.1 php8.1-cli php8.1-common php8.1-curl php8.1-mbstring php8.1-xml php8.1-zip
46+
```
47+
48+
2. 安装Go:
49+
```bash
50+
wget -q https://golang.org/dl/go1.20.3.linux-amd64.tar.gz
51+
sudo tar -C /usr/local -xzf go1.20.3.linux-amd64.tar.gz
52+
export PATH=$PATH:/usr/local/go/bin
53+
```
54+
55+
3. 编译并运行测试程序:
56+
```bash
57+
cd /path/to/go-composer-sdk
58+
cd tests/docker
59+
go build -o test_linux_install
60+
./test_linux_install
61+
```
62+
63+
## 测试输出
64+
65+
成功的测试会输出类似下面的结果:
66+
67+
```
68+
===== 开始在Linux环境中测试Composer自动安装 =====
69+
已创建临时目录: /tmp/composer-linux-test-123456
70+
PHP路径: /usr/bin/php
71+
PHP版本: PHP 8.1.x (cli)...
72+
73+
===== 测试1: 使用SDK自动安装Composer =====
74+
自动安装成功! Composer版本: 2.x.x
75+
Composer安装路径: /usr/local/bin/composer
76+
77+
===== 测试2: 使用自定义安装目录 =====
78+
开始自定义安装...
79+
自定义安装成功! 文件路径:
80+
- composer.phar: /tmp/composer-linux-test-123456/custom-composer/composer.phar
81+
- composer脚本: /tmp/composer-linux-test-123456/custom-composer/composer
82+
自定义Composer版本: 2.x.x
83+
84+
===== 测试3: 创建简单PHP项目 =====
85+
安装项目依赖...
86+
项目依赖安装成功!
87+
88+
===== 所有测试通过! =====

tests/docker/main.go

Lines changed: 173 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,173 @@
1+
package main
2+
3+
import (
4+
"fmt"
5+
"log"
6+
"os"
7+
"os/exec"
8+
"path/filepath"
9+
"time"
10+
11+
"github.com/scagogogo/go-composer-sdk/pkg/composer"
12+
"github.com/scagogogo/go-composer-sdk/pkg/installer"
13+
)
14+
15+
func main() {
16+
fmt.Println("===== 开始在Linux环境中测试Composer自动安装 =====")
17+
18+
// 创建临时目录
19+
tempDir, err := os.MkdirTemp("", "composer-linux-test-*")
20+
if err != nil {
21+
log.Fatalf("创建临时目录失败: %v", err)
22+
}
23+
defer os.RemoveAll(tempDir)
24+
fmt.Printf("已创建临时目录: %s\n", tempDir)
25+
26+
// 测试PHP是否正常安装
27+
phpPath, err := exec.LookPath("php")
28+
if err != nil {
29+
log.Fatalf("未找到PHP: %v", err)
30+
}
31+
fmt.Printf("PHP路径: %s\n", phpPath)
32+
33+
// 获取PHP版本
34+
cmd := exec.Command(phpPath, "-v")
35+
output, err := cmd.CombinedOutput()
36+
if err != nil {
37+
log.Fatalf("获取PHP版本失败: %v", err)
38+
}
39+
fmt.Printf("PHP版本: %s\n", string(output))
40+
41+
// 检查Composer是否已安装
42+
_, err = exec.LookPath("composer")
43+
if err == nil {
44+
fmt.Println("警告: Composer已在系统中安装,将移除以确保测试环境干净")
45+
removeCmd := exec.Command("rm", "-f", "/usr/local/bin/composer", "/usr/bin/composer")
46+
if err := removeCmd.Run(); err != nil {
47+
fmt.Printf("移除现有Composer失败: %v,但将继续测试\n", err)
48+
}
49+
}
50+
51+
fmt.Println("\n===== 测试1: 使用SDK自动安装Composer =====")
52+
53+
// 创建一个未指定Composer路径的实例
54+
comp, err := composer.New(composer.Options{
55+
AutoInstall: true, // 启用自动安装
56+
DefaultTimeout: 3 * time.Minute,
57+
})
58+
if err != nil {
59+
log.Fatalf("创建Composer实例失败: %v", err)
60+
}
61+
62+
// 通过运行版本命令来触发自动安装
63+
version, err := comp.GetVersion()
64+
if err != nil {
65+
log.Fatalf("获取Composer版本失败: %v", err)
66+
}
67+
fmt.Printf("自动安装成功! Composer版本: %s\n", version)
68+
69+
// 获取安装路径
70+
path, err := exec.LookPath("composer")
71+
if err != nil {
72+
log.Fatalf("安装后未找到Composer: %v", err)
73+
}
74+
fmt.Printf("Composer安装路径: %s\n", path)
75+
76+
fmt.Println("\n===== 测试2: 使用自定义安装目录 =====")
77+
78+
// 创建自定义安装目录
79+
customDir := filepath.Join(tempDir, "custom-composer")
80+
if err := os.MkdirAll(customDir, 0755); err != nil {
81+
log.Fatalf("创建自定义目录失败: %v", err)
82+
}
83+
84+
// 配置自定义安装选项
85+
installConfig := installer.DefaultConfig()
86+
installConfig.InstallPath = customDir
87+
installConfig.UseSudo = false
88+
89+
inst := installer.NewInstaller(installConfig)
90+
91+
// 执行安装
92+
fmt.Println("开始自定义安装...")
93+
if err := inst.Install(); err != nil {
94+
log.Fatalf("自定义安装失败: %v", err)
95+
}
96+
97+
customPharPath := filepath.Join(customDir, "composer.phar")
98+
customScriptPath := filepath.Join(customDir, "composer")
99+
100+
// 检查安装的文件
101+
if _, err := os.Stat(customPharPath); os.IsNotExist(err) {
102+
log.Fatalf("自定义安装未创建composer.phar文件: %v", err)
103+
}
104+
if _, err := os.Stat(customScriptPath); os.IsNotExist(err) {
105+
log.Fatalf("自定义安装未创建composer脚本: %v", err)
106+
}
107+
108+
fmt.Printf("自定义安装成功! 文件路径:\n- composer.phar: %s\n- composer脚本: %s\n",
109+
customPharPath, customScriptPath)
110+
111+
// 使用自定义安装路径创建Composer实例
112+
customComp, err := composer.New(composer.Options{
113+
ExecutablePath: customScriptPath,
114+
DefaultTimeout: 2 * time.Minute,
115+
})
116+
if err != nil {
117+
log.Fatalf("创建自定义Composer实例失败: %v", err)
118+
}
119+
120+
// 测试自定义安装的Composer
121+
customVersion, err := customComp.GetVersion()
122+
if err != nil {
123+
log.Fatalf("获取自定义Composer版本失败: %v", err)
124+
}
125+
fmt.Printf("自定义Composer版本: %s\n", customVersion)
126+
127+
fmt.Println("\n===== 测试3: 创建简单PHP项目 =====")
128+
129+
// 创建项目目录
130+
projectDir := filepath.Join(tempDir, "test-project")
131+
if err := os.MkdirAll(projectDir, 0755); err != nil {
132+
log.Fatalf("创建项目目录失败: %v", err)
133+
}
134+
135+
// 创建composer.json
136+
composerJson := `{
137+
"name": "test/linux-composer-project",
138+
"description": "Linux Composer测试项目",
139+
"type": "project",
140+
"require": {
141+
"monolog/monolog": "^2.0"
142+
}
143+
}`
144+
145+
if err := os.WriteFile(filepath.Join(projectDir, "composer.json"), []byte(composerJson), 0644); err != nil {
146+
log.Fatalf("创建composer.json失败: %v", err)
147+
}
148+
149+
// 切换到项目目录
150+
customComp.SetWorkingDir(projectDir)
151+
152+
// 安装依赖
153+
fmt.Println("安装项目依赖...")
154+
err = customComp.Install(false, false)
155+
if err != nil {
156+
log.Fatalf("安装依赖失败: %v", err)
157+
}
158+
159+
// 检查vendor目录
160+
vendorDir := filepath.Join(projectDir, "vendor")
161+
if _, err := os.Stat(vendorDir); os.IsNotExist(err) {
162+
log.Fatalf("vendor目录未创建: %v", err)
163+
}
164+
165+
monologDir := filepath.Join(vendorDir, "monolog", "monolog")
166+
if _, err := os.Stat(monologDir); os.IsNotExist(err) {
167+
log.Fatalf("monolog库未安装: %v", err)
168+
}
169+
170+
fmt.Println("项目依赖安装成功!")
171+
172+
fmt.Println("\n===== 所有测试通过! =====")
173+
}

0 commit comments

Comments
 (0)