如何 使用 脚本自动化测试StarryOS 的各种命令

如何 使用 脚本自动化测试StarryOS 的各种命令

hejiashenghejiasheng
18 次阅读
自动化测试StarryOS测试脚本
文章目录

目标

构建一套 测试脚本 自动化测试 StarryOS 里面的各种命令 ; 目前主要针对 busybox的所有脚本

基本原理

基于Qemu 可以提供 tcp serial 的原理,将qemu启动的时候串口输入输出 都放在tcp上。 而不是 控制台。 启动脚本例子如下:

bash
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

简单测试

bash
 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 一样

python
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)

结果大概如下,并没有粘贴全:

bash
python3 test.py ls output:starry:~# ^[[54;11RBusyBox commands:[[[acpidadd-shelladdgroupadduseradjtimexarcharparpingashawkbase64basenamebbconfigbcbeepblkdiscardblkid

接下来如何做?

  • 构建一个圈套的测试环境,基于这个原理 将测试日志记录
  • 结果对比和参考需要 挨个分析,每个命令都不一样

建立github项目

bash
git clone https://github.com/asmcos/ChenLongTestcd  ChenLongTest

修改 main.py 里面 服务器的ip, 一般是 127.0.0.1 就可以

bash
python3 main.py 

结果如下: 图片

如何添加你自己的测试程序:

bash
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

python
# 与 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

python
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 后面是测试的时间戳

bash
run.log 是总的结果

每个命令都有自己的独立日志,例如 busybox_bc 图片

评论区0

还没有评论,快来抢沙发吧~

登录 后可发表评论