From 9b3c8781591aef46fb5544c3f118aee574db3c95 Mon Sep 17 00:00:00 2001 From: xiaji Date: Tue, 10 Mar 2026 22:31:30 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0mumu-pytest=E6=B5=8B=E8=AF=95?= =?UTF-8?q?=E6=A1=86=E6=9E=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mumu-pytest/README.md | 88 +++++++++++ mumu-pytest/conftest.py | 211 +++++++++++++++++++++++++ mumu-pytest/requirements.txt | 3 + mumu-pytest/running.png | Bin 0 -> 41294 bytes mumu-pytest/start.png | Bin 0 -> 942 bytes mumu-pytest/test_mumu.py | 27 ++++ mumu-pytest/web.png | Bin 0 -> 2770 bytes mumu-pytest/web_address.png | Bin 0 -> 5274 bytes mumu-pytest/web_debug.png | Bin 0 -> 1466 bytes mumu-pytest/web_debug_apk.png | Bin 0 -> 3319 bytes mumu-pytest/web_debug_apk_download.png | Bin 0 -> 1356 bytes mumu-pytest/web_debug_apk_install.png | Bin 0 -> 1724 bytes mumu-pytest/web_debug_apk_open.png | Bin 0 -> 1040 bytes mumu-pytest/web_debug_apk_run.png | Bin 0 -> 996 bytes mumu-pytest/web_goon.png | Bin 0 -> 4252 bytes 15 files changed, 329 insertions(+) create mode 100644 mumu-pytest/README.md create mode 100644 mumu-pytest/conftest.py create mode 100644 mumu-pytest/requirements.txt create mode 100644 mumu-pytest/running.png create mode 100644 mumu-pytest/start.png create mode 100644 mumu-pytest/test_mumu.py create mode 100644 mumu-pytest/web.png create mode 100644 mumu-pytest/web_address.png create mode 100644 mumu-pytest/web_debug.png create mode 100644 mumu-pytest/web_debug_apk.png create mode 100644 mumu-pytest/web_debug_apk_download.png create mode 100644 mumu-pytest/web_debug_apk_install.png create mode 100644 mumu-pytest/web_debug_apk_open.png create mode 100644 mumu-pytest/web_debug_apk_run.png create mode 100644 mumu-pytest/web_goon.png diff --git a/mumu-pytest/README.md b/mumu-pytest/README.md new file mode 100644 index 0000000..f8e231c --- /dev/null +++ b/mumu-pytest/README.md @@ -0,0 +1,88 @@ +# Mumu 模拟器 pytest 测试框架 + +## 目录结构 + +``` +mumu-pytest/ +├── conftest.py # pytest配置和公共fixture +├── test_mumu.py # 测试用例 +├── start.png # 启动按钮图片 +├── running.png # 运行中图片 +├── web.png # web按钮图片 +├── web_address.png # 地址输入框图片 +├── web_goon.png # 继续按钮图片 +├── web_debug.png # 调试按钮图片 +├── web_debug_apk.png # APK按钮图片 +├── web_debug_apk_download.png # 下载按钮图片 +├── web_debug_apk_open.png # 打开文件按钮图片 +├── web_debug_apk_install.png # 安装按钮图片 +├── web_debug_apk_run.png # 运行按钮图片 +├── requirements.txt # Python依赖 +└── README.md # 说明文档 +``` + +## 安装依赖 + +```bash +pip install -r requirements.txt +``` + +## 配置 + +在 `conftest.py` 中修改以下配置: + +```python +MUMU_EXE_PATH = r"C:\Program Files\Netease\MuMu\nx_main\MuMuNxMain.exe" +ADB_PATH = r"C:\Program Files\Netease\MuMu\shell\adb.exe" +WEB_URL = "http://192.168.3.15/" +INSTALLED_PACKAGE_NAME = "com.example.flomo_ai" +``` + +## 图片说明 + +将以下图片放入 `mumu-pytest` 目录: + +| 文件名 | 说明 | +|--------|------| +| start.png | 启动按钮 | +| running.png | 运行中标识 | +| web.png | Web按钮 | +| web_address.png | 地址输入框 | +| web_goon.png | 继续按钮 | +| web_debug.png | 调试按钮 | +| web_debug_apk.png | APK按钮 | +| web_debug_apk_download.png | 下载按钮 | +| web_debug_apk_open.png | 打开文件按钮 | +| web_debug_apk_install.png | 安装按钮 | +| web_debug_apk_run.png | 运行按钮 | + +## 运行测试 + +```bash +# 运行所有测试 +pytest + +# 显示详细输出 +pytest -v -s +``` + +## 测试流程 + +1. 启动模拟器 (start.png) +2. 等待运行中 (running.png) +3. 点击Web按钮 (web.png) +4. 输入URL地址 (web_address.png -> http://192.168.3.15/) +5. 点击继续 (web_goon.png) +6. 点击调试 (web_debug.png) +7. 点击APK (web_debug_apk.png) +8. 点击下载 (web_debug_apk_download.png) +9. 点击打开 (web_debug_apk_open.png) +10. 点击安装 (web_debug_apk_install.png) +11. 点击运行 (web_debug_apk_run.png) + +## 注意事项 + +1. 确保MuMu模拟器已正确安装 +2. 需要先截取各个步骤对应的图片 +3. pyautogui需要配置合适的置信度和超时时间 +4. 确保模拟器路径和ADB路径正确 diff --git a/mumu-pytest/conftest.py b/mumu-pytest/conftest.py new file mode 100644 index 0000000..8e7a57c --- /dev/null +++ b/mumu-pytest/conftest.py @@ -0,0 +1,211 @@ +""" +Mumu模拟器 pytest 测试框架 +""" + +import pytest +import pyautogui +import time +import os +import subprocess +import requests +from pathlib import Path + +# 配置 +MUMU_EXE_PATH = r"C:\Program Files\Netease\MuMu\nx_main\MuMuNxMain.exe" +MUMU_PROCESS_NAME = "MuMuNxMain.exe" +ADB_PATH = r"C:\Program Files\Netease\MuMu\shell\adb.exe" +APK_DOWNLOAD_URL = "http://your-server.com/app-release.apk" +LOCAL_APK_PATH = os.path.join(os.path.dirname(__file__), "test_app.apk") +INSTALLED_PACKAGE_NAME = "com.example.flomo_ai" +WEB_URL = "http://192.168.3.15/" + +SCRIPT_DIR = os.path.dirname(__file__) + + +class MumuEmulator: + """Mumu模拟器控制类""" + + def __init__(self): + self.process_name = MUMU_PROCESS_NAME + self.script_dir = SCRIPT_DIR + pyautogui.PAUSE = 1 + pyautogui.FAILSAFE = True + + def is_running(self) -> bool: + """检查模拟器是否运行""" + try: + result = subprocess.run( + ["tasklist"], + capture_output=True, + text=True + ) + return self.process_name in result.stdout + except Exception: + return False + + def start(self): + """启动模拟器""" + if not self.is_running(): + subprocess.Popen(MUMU_EXE_PATH) + time.sleep(5) + + def find_and_click(self, image_name, confidence=0.8, timeout=30): + """查找图片并点击""" + image_path = os.path.join(self.script_dir, f"{image_name}.png") + if not os.path.exists(image_path): + print(f"图片不存在: {image_path}") + return False + + start_time = time.time() + while time.time() - start_time < timeout: + try: + location = pyautogui.locateOnScreen(image_path, confidence=confidence) + if location: + center = pyautogui.center(location) + pyautogui.click(center) + print(f"点击了: {image_name}") + return True + except Exception as e: + pass + time.sleep(1) + print(f"未找到图片: {image_name}") + return False + + def type_text(self, text): + """输入文本""" + pyautogui.write(text, interval=0.1) + print(f"输入了文本: {text}") + + def press_enter(self): + """按回车""" + pyautogui.press("enter") + print("按下回车") + + def wait_for_boot(self, timeout=120): + """等待模拟器启动完成""" + boot_completed = False + start_time = time.time() + while time.time() - start_time < timeout: + if self.is_running(): + time.sleep(5) + boot_completed = True + break + time.sleep(2) + return boot_completed + + def check_image_exists(self, image_name, confidence=0.8) -> bool: + """检查图片是否存在""" + image_path = os.path.join(self.script_dir, f"{image_name}.png") + if not os.path.exists(image_path): + return False + try: + location = pyautogui.locateOnScreen(image_path, confidence=confidence) + return location is not None + except Exception: + return False + + def run_sequence(self): + """按顺序执行任务""" + sequence = [ + "start", + "running", + "web", + "web.address", + "web_goon", + "web_debug", + "web_debug_apk", + "web_debug_apk_download", + "web_debug_apk_open", + "web_debug_apk_install", + "web_debug_apk_run" + ] + + for image_name in sequence: + if image_name == "web.address": + if self.check_image_exists("web.address"): + time.sleep(1) + self.type_text(WEB_URL) + time.sleep(0.5) + self.press_enter() + else: + print("web.address 图片不存在,跳过输入URL") + else: + self.find_and_click(image_name, timeout=10) + time.sleep(2) + + def close(self): + """关闭模拟器""" + try: + subprocess.run(["taskkill", "/F", "/IM", self.process_name]) + except Exception: + pass + + +class AdbHelper: + """ADB命令辅助类""" + + def __init__(self): + self.adb_path = ADB_PATH + + def exec_cmd(self, *args): + """执行ADB命令""" + cmd = [self.adb_path] + list(args) + result = subprocess.run(cmd, capture_output=True, text=True) + return result.stdout, result.stderr + + def install_apk(self, apk_path: str) -> bool: + """安装APK""" + stdout, stderr = self.exec_cmd("install", "-r", apk_path) + return "Success" in stdout + + def uninstall_app(self, package_name: str) -> bool: + """卸载应用""" + stdout, stderr = self.exec_cmd("uninstall", package_name) + return "Success" in stdout + + def launch_app(self, package_name: str, activity: str): + """启动应用""" + self.exec_cmd("shell", "am", "start", "-n", f"{package_name}/{activity}") + + def is_app_installed(self, package_name: str) -> bool: + """检查应用是否已安装""" + stdout, _ = self.exec_cmd("shell", "pm", "list", "packages", package_name) + return package_name in stdout + + def pull_file(self, remote_path: str, local_path: str): + """从模拟器拉取文件""" + self.exec_cmd("pull", remote_path, local_path) + + +@pytest.fixture(scope="session") +def emulator(): + """模拟器fixture""" + mumu = MumuEmulator() + yield mumu + # 测试结束后清理 + if mumu.is_running(): + mumu.close() + + +@pytest.fixture(scope="session") +def adb(): + """ADB fixture""" + return AdbHelper() + + +@pytest.fixture(scope="session") +def download_apk(): + """下载APK""" + if os.path.exists(LOCAL_APK_PATH): + return LOCAL_APK_PATH + + response = requests.get(APK_DOWNLOAD_URL, stream=True) + with open(LOCAL_APK_PATH, "wb") as f: + for chunk in response.iter_content(chunk_size=8192): + f.write(chunk) + + yield LOCAL_APK_PATH + + # 清理 + if os.path.exists(LOCAL_APK_PATH): + os.remove(LOCAL_APK_PATH) diff --git a/mumu-pytest/requirements.txt b/mumu-pytest/requirements.txt new file mode 100644 index 0000000..ede4101 --- /dev/null +++ b/mumu-pytest/requirements.txt @@ -0,0 +1,3 @@ +pytest>=7.0.0 +pyautogui>=0.9.54 +requests>=2.28.0 diff --git a/mumu-pytest/running.png b/mumu-pytest/running.png new file mode 100644 index 0000000000000000000000000000000000000000..d25fead451749fb6fc2997825bfed533a4bd7726 GIT binary patch literal 41294 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 QHvj+t07*qoM6N<$f^5{sOaK4? literal 0 HcmV?d00001 diff --git a/mumu-pytest/test_mumu.py b/mumu-pytest/test_mumu.py new file mode 100644 index 0000000..b86edf4 --- /dev/null +++ b/mumu-pytest/test_mumu.py @@ -0,0 +1,27 @@ +""" +Mumu模拟器测试 +""" + +import pytest + + +def test_start_emulator_sequence(emulator): + """测试模拟器启动和操作序列""" + assert not emulator.is_running(), "模拟器已启动" + emulator.start() + assert emulator.is_running(), "模拟器启动失败" + + +def test_run_sequence(emulator): + """测试按顺序执行任务""" + if not emulator.is_running(): + pytest.skip("模拟器未运行") + + emulator.run_sequence() + + +def test_close_emulator(emulator): + """测试关闭模拟器""" + if emulator.is_running(): + emulator.close() + assert not emulator.is_running(), "模拟器关闭失败" diff --git a/mumu-pytest/web.png b/mumu-pytest/web.png new file mode 100644 index 0000000000000000000000000000000000000000..62f5ab985b7d435b5f17fb17111f7c362b63a7b1 GIT binary patch literal 2770 zcmV;@3N7`CP)`Xl+X$G--!2?aZCIb023f|2X^Xv(ICu(+4rSlbh)| z_dM3O*SEg)?R_h%svN_Z?km4P(C4SyIyL z`ilm*;FJa<19B{(_#sCNYND(BaA$|d_V!r0E#bsBEDB%*E1)Pu28%i%IZ$f=NzYkH zK}QX^X1vLb7Y?#&$+3YuVo>cw`NiHI_wDEq%_$pSNQgU{1}R`oDJ$Z@75a zmYu)(qCu`Zx5;pPbl{E%)ax^rFTc{}jdsFNOWF8hg6ZeS-m#8Y%(`?g>DqR1AQMV2y$Z z*KUmY>ZU==B9WQHW$58OUB2r80j%9_8J-D)Q}-!nLBZr1!BLBF5`x-8()X!2`Z_>X z;5S?Q-2a!(qBFH1s3-RKxM%yEKaM-FdY4TV%_&?Om;@9|gYh6FlW@)H<+G%Pd&6uN z?ib~;tz916+&wl>|7s=NzO_xr&2?K6#O5!oqh6K?8&c5+7hFpfh)NZxbv?}jkG$ID z4}1DY2Wlo!Zhf^)JIT+9!m_vXnJdzWAY+=-$;~*~cO?}>qy#Q_Ms`2=K9>mG@xmNa z-G#NS7Szw*?6RY6b3nl8gwp7#55N{?UQnY2SL_xOG;A}YaS%yRdknWjCLC&?N&mqE#2NM2% zz?MUwAJl`py7W~M*BRWqi91xXWc|$MLEDT@4hSM?6Q-EOOxY;iAAT$vOi~)H6~!Wa z=jHj;umI{{Pxu9GQ3^qk>qhi5lisnHO(9J4w-*WvWLtJ)NlV(HcTjh<3g!`YKVR|TX_vA`P z#sIWfvjr+=HJM8NKc~`_LD^_{P?J4n+iZfm8p^UH09Hw2DX3E>-M$Ygm~H|JpZ?$w zAG>6TW~2DJcddxH?DQs^cXavIV=dZ|FuS6WKF3q9C@M;BlJiU}3QQ&N(qzKJ z>G$uM6ty9xT3An_La$l&Z7CH{kZyuFKzH9f%8i!|R{;50G;ra2n*8|l%UQ0<=-w_P zZ}-#rHi4oVoO6+q4O4HWRN$AptIgPh`p0zNQ_dg`P$m{iXQV0+YAy6qFaS4QF~oaM zZd6`UH%=HeeEo){05oSTD|UA)2V-vOK82O(i}vsHPbp&sJ;9cp6|p z`xcVCvx~qDmkuuqP&Urq5VPrwW_rJc6}x*x9rbM?Q@pA%7T=gBx>W@6bsc4UocoWUb(wV+|A7|u3r`Glv^pQm_!5rm{Za>ez*5AW0i6= z9#k($gEw9v)YA`FSN#||1NCMyUR)_vhA~nR7117t#l-W)dl!*){?ds=C8P`HWTZKR~%6)19lmMp0IC5oc(_dI~?i zVWG9k6oB3JtLX|27Be1wwp}Svi3Aadx(c@B4Sh3Cg=A?gmAwm}sqtl|l%0A&nUHjr z8KzH&JQZg;%C7xKmaWN_<h_f%JT=4Ath-*oGz>-r$u_tY#wKiKC(3WD39PNz zs`j8xTVg6;a+?$$7c;04wAMt-jT+i0U;NP|JN7TUk8o(#a`)pcUfkMEXQ?4bY&;O7 zf>^;Q#2xE;l;+mV?J=qd9~iBwmKWj^1`VqR3=^|9cM_qi(2^%CP*UkF5&FXs-Hvk0 zqtjecske_5!Grh7Fglj%(=^E*f#Bx3G|`WKP{R>b@5b!nh2Smp7gb z0U*&}=gKb$l_imI)7p9)QvfBvEoTiBX0WgnneRhRA4*ippQS-owFJmzigW_W`lN!5 z#9N|VyM-IpM9lX~PenRTAC0*B=0VZ z#BF8g6F=5~+fIq=5!Hbbfv=o9#7Kmvj;B*yLoNtOHpA{O;%iF+`eikg(=n`D_fArZ z?%LQ)gF?N<`}S!u%>{l1sQqf?pzzI$hl2oW=$C=Kg3p*%9)ToBNLpal5Rc|%;WKK6jl|&ln*{ z=f?MKX!s4VSm2NEADmYl76l3*GH~bRBV4&5_5ccsX7eI9{yRrGt0f>>awmatMvB=( z*m6OWBuWt&f#)tBWNEax{elHS;kLByymEwVPH*~UyvgbTsiCG67Mn$N3(d0T9J8^qJQf>Do_AZbINT`wAeAx_aM9|Beoh=s!|d%pxxx1F zCIb;Xa7N5khf%rX1}Ymb?dfyxGqX&#tlM>}noV-m-LiE<-logO`%e3;U4@99-Mr;5kh`v%bOS)-{d^ z%y9!1j-78MJo;>#y$39Q{s492d`w(=xUHyL;{eE9>zvm~~Sbw?x Y2X>zyIsey#i~s-t07*qoM6N<$g1)sgIsgCw literal 0 HcmV?d00001 diff --git a/mumu-pytest/web_address.png b/mumu-pytest/web_address.png new file mode 100644 index 0000000000000000000000000000000000000000..7782355bab143b18b28f5d053e94c85961e35854 GIT binary patch literal 5274 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 UJdc-2t^fc407*qoM6N<$g3VRIt^fc4 literal 0 HcmV?d00001 diff --git a/mumu-pytest/web_debug_apk.png b/mumu-pytest/web_debug_apk.png new file mode 100644 index 0000000000000000000000000000000000000000..0c347ccd9516fee2fa3823165eba4b3346f214b8 GIT binary patch literal 3319 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 literal 0 HcmV?d00001 diff --git a/mumu-pytest/web_debug_apk_open.png b/mumu-pytest/web_debug_apk_open.png new file mode 100644 index 0000000000000000000000000000000000000000..5436d89dab31b7f4627df0531eb51839dd2ba2a7 GIT binary patch literal 1040 zcmeAS@N?(olHy`uVBq!ia0vp^p+IcS!3HF`xQ`VuFfd>Dba4!+nDcgabdE@<#PNFL z-M6PXMeowxc4e1|ub21aV;iRIo2bCJN}{>eKtiC#G0<7*qN)q)(G?y}H48+W1$*_` zrnux?tmwSha*4gylUX#`clNal-3Ax*@^){3*Tetd)UNIer_C>$J^#Mt^I6OLKhNt= zo@;z^-Lvodn*)3_cU@*oQ}$ZLKs@U6I(u%WcV67W$$~BgA+KKXGR~|0yadFtmVFQw zlgGbwpK7^n-Gb-hKE{r551F>@{r7XpwSQ~>vY)Hjk{)FHFEPsV?AgzoULO7azUt4x z15%3~3UpTV+&edaa;fj-6)Q3mZoEi-acb$7%6(e)A0uWo-ix1Xx_Eyz*SZI6m%Xww zei-TQmb(0E->TF#_jmQL?|-*^^WWbowo-D82__;>e(biMR2o|@n34JPQGfi!Uq>fy zsk{BXzSHo=WTSMgjj^vDTk{3RRoXMmTDLe;s_|JEL(_G(9|`Z1GmDcZ1~NRFXz=ht z>1^SC`P)m&Vl$rJO5kVM_o|Ak`?Tf#GOmUX9v9wODBaNey8L~gn!Wv>C)pwu-ant+ zVBDSDvB>N{lh11QP{%;YgRB2Op11wc#M~Ws<~`ZC?Cy?mtt_d6^ruUDzo(o}tSgk% zp1p1PmD}g%0lhjq;9GQI%&KL(Bep*ctqHBOiM+YxO;yGn+gI{88q}-(qV}%Y)VJx> zuAX9>NK2D7_of8BewQ(OW>B}6){1ZIlLCEhxy7$8daai=ef`qchb+%+pF1z$d~>7e zg1^-^>le&Ozh`k${k_duhxbRfd_2Fmv~6|$w@;bHujXc{o#9;jKR##ruLr{V#rdhS z(^3Vwq@J9c?f?1Q)+5OiIlr5nbvgBM(l0li(~H*cWk zW4QbF*o*gz3Lkr4`4R5xm7z9mUB)4wp1WZyOtyLNz4Lwd52>H`g4%k&To2woqcnPz z`}TLt55Baox0sd~=DBxyjbZonbt+cB#GC6&tfnQWd0gFM&3E$qv<;Qd1sxvmz56=1 zv(#GV=5o8O-;FPraP8sFw+jf;j0re*Oq|bHtUF7F?P9QNnepC`)f$pL~_w+dmhkdbc#OseTVVeD~X+=7)sY_WP7=Sp&@J44$rj JF6*2UngA4;0;m80 literal 0 HcmV?d00001 diff --git a/mumu-pytest/web_debug_apk_run.png b/mumu-pytest/web_debug_apk_run.png new file mode 100644 index 0000000000000000000000000000000000000000..483e4b74f0846613b67b74c4ee830e457a4db0a4 GIT binary patch literal 996 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