目标
构建一套 测试脚本 自动化测试 StarryOS 里面的各种命令 ; 目前主要针对 busybox的所有脚本
基本原理
基于Qemu 可以提供 tcp serial 的原理,将qemu启动的时候串口输入输出 都放在tcp上。 而不是 控制台。 启动脚本例子如下:
qemu-system-riscv64 -m 1G -smp 1 -machine virt -bios default -kernel StarryOS_riscv64-qemu-virt.bin -device virtio-blk-pci,drive=disk0 -drive id=disk0,if=none,format=raw,file=make/disk.img -device virtio-net-pci,netdev=net0 -netdev user,id=net0,hostfwd=tcp::5555-:5555,hostfwd=udp::5555-:5555 -display none -serial tcp:127.0.0.1:4444,server,nowait简单测试
telnet 127.0.0.1 4444Trying 127.0.0.1...Connected to 127.0.0.1.Escape character is '^]'.lslsstarry:~# starry:~# ^[[54;11R证明连接成功了。
用python 写一个测试脚本 原理和telnet 一样
import socketimport timedef send_cmd(cmd, timeout=0.5): sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.connect(('127.0.0.1', 4444)) # 设置接收超时 sock.settimeout(timeout) # 可选:先清空缓冲区(读取已有数据) try: while True: sock.recv(1024) except socket.timeout: pass # 清空完成 # 发送命令 sock.send((cmd + '\n').encode()) # 收集输出 output = b'' while True: try: chunk = sock.recv(4096) if not chunk: break output += chunk except socket.timeout: # 超时表示没有更多数据了 break sock.close() # 去除命令回显(如果第一行是命令本身) lines = output.decode().split('\n') if lines and lines[0].strip() == cmd: lines = lines[1:] return '\n'.join(lines).strip()if __name__ == '__main__': # 测试 ls result = send_cmd('ls') print("ls output:") print(result) # 测试 busybox --list result2 = send_cmd('busybox --list') print("\nBusyBox commands:") print(result2)结果大概如下,并没有粘贴全:
python3 test.py ls output:starry:~# ^[[54;11RBusyBox commands:[[[acpidadd-shelladdgroupadduseradjtimexarcharparpingashawkbase64basenamebbconfigbcbeepblkdiscardblkid接下来如何做?
- 构建一个圈套的测试环境,基于这个原理 将测试日志记录
- 结果对比和参考需要 挨个分析,每个命令都不一样
建立github项目
git clone https://github.com/asmcos/ChenLongTestcd ChenLongTest修改 main.py 里面 服务器的ip, 一般是 127.0.0.1 就可以
python3 main.py 结果如下:

如何添加你自己的测试程序:
chenlongos@chenlongos-LAPKC71E:~/ChenLongTest$ ls busybox/Display all 307 possibilities? (y or n)__init__.py test_find.py test_mkfs_vfat.py test_sha1sum.py__pycache__/ test_flock.py test_mknod.py test_sha256sum.pytest_acpid.py test_fold.py test_mkpasswd.py test_sha3sum.pytest_addgroup.py test_free.py test_mkswap.py test_sha512sum.pytest_add_shell.py test_fsck.py test_mktemp.py test_showkey.pytest_adduser.py test_fstrim.py test_modinfo.py test_sh.pytest_adjtimex.py test_fsync.py test_modprobe.py test_shred.pytest_arch.py test_fuser.py test_more.py test_shuf.pytest_arping.py test_getopt.py test_mountpoint.py test_slattach.pytest_arp.py test_getty.py test_mount.py test_sleep.pytest_ash.py test_grep.py test_mpstat.py test_sort.pytest_awk.py test_groups.py test_mv.py test_split.py例子1
# 与 logs/.../busybox_list.log 一致:列出 BusyBox appletsTEST = { "order": 6, "name": "busybox_list", "cmd": "busybox --list", "expected_substring": None, "expect_non_empty": True, "timeout": 3.0,}例子2
详细见 test_adduser.py
TEST = { "order": 4, "name": "busybox_adduser", "cmd": f"busybox adduser -D -H {_USER}; grep /etc/passwd (user {_USER})", "timeout": 5.0,}def run(client: QemuSerialClient) -> Tuple[bool, str, str]: u = _USER chunks: list[str] = [] ok = False msg = "" try: client.send_cmd(f"busybox deluser {u} 2>&1", timeout=2.0) out = client.send_cmd(f"busybox adduser -D -H {u} 2>&1", timeout=3.0) chunks.append("=== busybox adduser -D -H ===\n" + out) verify = client.send_cmd(f"busybox grep -F '{u}:' /etc/passwd 2>&1", timeout=2.0) chunks.append("=== grep /etc/passwd ===\n" + verify)命令测试说明表格

304个全部 的详细列表见 https://github.com/asmcos/ChenLongTest/blob/main/busybox/TEST_COMMANDS.md
测试结果
logs/20260415_111207 后面是测试的时间戳
run.log 是总的结果每个命令都有自己的独立日志,例如 busybox_bc

