PageSourceSearch

https://openutx.cn/post/24

html openutx.cn collected 2026-10-02 01:20:05 UTC 53,018 bytes, 228 lines download raw bytes

1<!DOCTYPE html><html class="light" lang="zh"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no"/><title>UTX 自动化工具介绍</title>
1<script type="module" src="https://openutx.cn/.webmcp/bridge.js" data-packs="c2pa,mcp-server-client"></script>
1<link rel="icon" href="https://openutx.cn/static/img/c33b34619bc47966f93b4530f4afb658.pic.webp"/><meta name="description" content=" 李佳玮【测试开发囤货】,专注于测试开发领域技术分享。"/><meta name="robots" content="index, follow"/><meta name="keywords" content="开源项目"/><meta name="next-head-count" content="7"/><link rel="preload" href="/_next/static/css/2e8f2903920e3d56.css" as="style"/><link rel="stylesheet" href="/_next/static/css/2e8f2903920e3d56.css" data-n-g=""/><link rel="preload" href="/_next/static/css/9ae4dde6b7ac938f.css" as="style"/><link rel="stylesheet" href="/_next/static/css/9ae4dde6b7ac938f.css" data-n-p=""/><link rel="preload" href="/_next/static/css/0db0828466c00f5b.css" as="style"/><link rel="stylesheet" href="/_next/static/css/0db0828466c00f5b.css" data-n-p=""/><link rel="preload" href="/_next/static/css/0711441c4e3c80d9.css" as="style"/><link rel="stylesheet" href="/_next/static/css/0711441c4e3c80d9.css"/><noscript data-n-css=""></noscript>
1<script defer="" nomodule="" src="/_next/static/chunks/polyfills-c67a75d1b6f99dc8.js"></script>
1<script src="/initTheme.js" defer="" data-nscript="beforeInteractive"></script>
1<script defer="" src="/_next/static/chunks/b032eac9.24d97d4a850d0206.js"></script>
1<script defer="" src="/_next/static/chunks/30301079.6eaa8133e6f76939.js"></script>
1<script defer="" src="/_next/static/chunks/579.7dd46b81306fe193.js"></script>
1<script src="/_next/static/chunks/webpack-062d0ccaa60c25a2.js" defer=""></script>
1<script src="/_next/static/chunks/framework-2647c7e378e02044.js" defer=""></script>
1<script src="/_next/static/chunks/main-07f3e9546a50d5ce.js" defer=""></script>
1<script src="/_next/static/chunks/pages/_app-4defada4b6a84c36.js" defer=""></script>
1<script src="/_next/static/chunks/5c6f9df4-222dcbb456633b3c.js" defer=""></script>
1<script src="/_next/static/chunks/dce46a15-62968ba2de7f8f2d.js" defer=""></script>
1<script src="/_next/static/chunks/426-909ad63f86439a6b.js" defer=""></script>
1<script src="/_next/static/chunks/11-e85653d868b202da.js" defer=""></script>
1<script src="/_next/static/chunks/640-06fe601a73ff6e81.js" defer=""></script>
1<script src="/_next/static/chunks/666-edd3f4d2e1406b6a.js" defer=""></script>
1<script src="/_next/static/chunks/390-3baf7084e1a0b56a.js" defer=""></script>
1<script src="/_next/static/chunks/178-5833a2c5a1b65a39.js" defer=""></script>
1<script src="/_next/static/chunks/pages/post/%5Bid%5D-a8cdae9081399362.js" defer=""></script>
1<script src="/_next/static/77JJh7CBRvlkoRHH7B3Ea/_buildManifest.js" defer=""></script>
1<script src="/_next/static/77JJh7CBRvlkoRHH7B3Ea/_ssgManifest.js" defer=""></script>
1</head><body><div id="__next"><div style="position:fixed;z-index:9999;top:16px;left:16px;right:16px;bottom:16px;pointer-events:none"></div><div class="fixed w-full h-full top-0 left-0 right-0 bottom-0  justify-center items-center flex" style="z-index:100;background-color:rgba(0,0,0,0.4);visibility:hidden"><div class="bg-white w-3/4  p-4 rounded-xl card-shadow dark:card-shadow-dark transition-all dark:bg-dark" style="min-height:280px;min-width:360px;max-width:710px;transform:scale(0)"><div class="flex items-center dark:text-dark text-gray-600"><svg viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2305" width="24" height="24" fill="currentColor"><path d="M789.804097 737.772047 742.865042 784.699846 898.765741 940.600545 945.704796 893.672746Z" p-id="2306"></path><path d="M456.92259 82.893942c-209.311143 0-379.582131 170.282245-379.582131 379.582131s170.270988 379.570875 379.582131 379.570875c209.287607 0 379.558595-170.270988 379.558595-379.570875S666.210197 82.893942 456.92259 82.893942zM770.128989 462.477097c0 172.721807-140.508127 313.229934-313.206398 313.229934-172.720783 0-313.229934-140.508127-313.229934-313.229934s140.508127-313.229934 313.229934-313.229934C629.620861 149.247162 770.128989 289.75529 770.128989 462.477097z" p-id="2307"></path></svg><input placeholder="搜索内容" class="w-full ml-2 text-base " style="height:32px;appearance:none;border:none;outline:medium;background-color:inherit" value=""/><div class="transition-all transform hover:scale-125 text-gray-600 dark:text-dark" style="visibility:hidden"><svg viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" fill="currentColor" p-id="2258" width="20" height="20" class="cursor-pointer"><path d="M512 39.384615C250.092308 39.384615 39.384615 250.092308 39.384615 512s210.707692 472.615385 472.615385 472.615385 472.615385-210.707692 472.615385-472.615385S773.907692 39.384615 512 39.384615z m96.492308 488.369231l153.6 153.6c7.876923 7.876923 7.876923 19.692308 0 27.569231l-55.138462 55.138461c-7.876923 7.876923-19.692308 7.876923-27.569231 0L525.784615 610.461538c-7.876923-7.876923-19.692308-7.876923-27.56923 0l-153.6 153.6c-7.876923 7.876923-19.692308 7.876923-27.569231 0L261.907692 708.923077c-7.876923-7.876923-7.876923-19.692308 0-27.569231l153.6-153.6c7.876923-7.876923 7.876923-19.692308 0-27.569231l-155.56923-155.56923c-7.876923-7.876923-7.876923-19.692308 0-27.569231l55.138461-55.138462c7.876923-7.876923 19.692308-7.876923 27.569231 0l155.569231 155.569231c7.876923 7.876923 19.692308 7.876923 27.56923 0l153.6-153.6c7.876923-7.876923 19.692308-7.876923 27.569231 0l55.138462 55.138462c7.876923 7.876923 7.876923 19.692308 0 27.56923l-153.6 153.6c-5.907692 7.876923-5.907692 19.692308 0 27.569231z" p-id="2259"></path></svg></div><div class="flex items-center select-none ml-2"><span style="opacity:1;height:24px;line-height:17.73px" class="hidden sm:block text-gray-500 text-sm leading-5 py-0.5 px-1.5 border border-gray-300 rounded-md dark:text-dark dark:border-dark"><span class="sr-only">Press </span><kbd class="font-sans">esc</kbd><span class="sr-only"> to close</span></span></div></div><hr class="my-2 dark:border-hr-dark"/><div class="dark:text-dark" style="max-height:400px;overflow-y:auto"><div class="mt-16 text-center"><div class="text-gray-600 dark:text-dark select-none">请输入并搜索</div></div></div></div></div><div id="nav" class=" bg-white sticky top-0 dark:bg-dark nav-shadow dark:nav-shadow-dark" style="z-index:90"><div class=" flex  items-center w-full border-b border-gray-200 h-14 dark:border-nav-dark" style="height:56px"><div class="mx-4 flex items-center"><div class="cursor-pointer block md:hidden"><span><svg viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1340" width="24" height="24" class="dark:text-dark fill-gray-600"><path d="M904 160H120c-4.4 0-8 3.6-8 8v64c0 4.4 3.6 8 8 8h784c4.4 0 8-3.6 8-8v-64c0-4.4-3.6-8-8-8zM904 784H120c-4.4 0-8 3.6-8 8v64c0 4.4 3.6 8 8 8h784c4.4 0 8-3.6 8-8v-64c0-4.4-3.6-8-8-8zM904 472H120c-4.4 0-8 3.6-8 8v64c0 4.4 3.6 8 8 8h784c4.4 0 8-3.6 8-8v-64c0-4.4-3.6-8-8-8z" p-id="1341"></path></svg></span></div></div><a href="/"><div class="text-gray-800 cursor-pointer select-none text-lg dark:text-dark lg:text-xl font-medium  mr-4 hidden md:block">每日测试技术分享</div></a><div class="flex justify-between h-full flex-grow nav-content"><div style="transform:translateX(30px)" class="cursor-pointer md:hidden  flex-grow text-center  flex items-center justify-center select-none dark:text-dark"><a href="/"><div>每日测试技术分享</div></a></div><ul class=" md:flex h-full items-center  text-sm text-gray-600 dark:text-dark hidden">
1<li class="nav-item transform hover:scale-110 dark:border-nav-dark  dark:transition-all ua"><a style="height:100%" href="/"><div class="h-full flex items-center px-2 md:px-4 ">首页</div></a></li><li class="nav-item transform hover:scale-110 dark:border-nav-dark  dark:transition-all ua"><a style="height:100%" href="/tag"><div class="h-full flex items-center px-2 md:px-4 ">标签</div></a></li><li class="nav-item transform hover:scale-110 dark:border-nav-dark  dark:transition-all ua"><a style="height:100%" href="/category"><div class="h-full flex items-center px-2 md:px-4 ">分类</div></a></li><li class="nav-item transform hover:scale-110 dark:border-nav-dark  dark:transition-all ua"><a style="height:100%" href="/timeline"><div class="h-full flex items-center px-2 md:px-4 ">时间线</div></a></li><li class="nav-item transform hover:scale-110 dark:border-nav-dark  dark:transition-all ua"><a style="height:100%" href="/link"><div class="h-full flex items-center px-2 md:px-4 ">友链</div></a></li><li class="nav-item transform hover:scale-110 dark:border-nav-dark  dark:transition-all ua"><a style="height:100%" href="/about"><div class="h-full flex items-center px-2 md:px-4 ">关于</div></a></li><li class="nav-item transform hover:scale-110 dark:border-nav-dark  dark:transition-all ua"><a style="height:100%" href="/post/24"><div class="h-full flex items-center px-2 md:px-4 ">UTX</div></a></li></ul><div class="flex nav-action"><div title="搜索" class="flex group transform hover:scale-110 transition-all select-none cursor-pointer"><div class="flex items-center mr-0 sm:mr-2 hover:cursor-pointer   transition-all dark:text-dark fill-gray-600"><svg viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2305" width="20" height="20"><path d="M789.804097 737.772047 742.865042 784.699846 898.765741 940.600545 945.704796 893.672746Z" p-id="2306"></path><path d="M456.92259 82.893942c-209.311143 0-379.582131 170.282245-379.582131 379.582131s170.270988 379.570875 379.582131 379.570875c209.287607 0 379.558595-170.270988 379.558595-379.570875S666.210197 82.893942 456.92259 82.893942zM770.128989 462.477097c0 172.721807-140.508127 313.229934-313.206398 313.229934-172.720783 0-313.229934-140.508127-313.229934-313.229934s140.508127-313.229934 313.229934-313.229934C629.620861 149.247162 770.128989 289.75529 770.128989 462.477097z" p-id="2307"></path></svg></div><div class="flex items-center "><div class="flex items-center"><span style="opacity:1;height:24px" class="hidden sm:flex items-center  text-gray-500 text-sm leading-5 py-0.5 px-1.5 border border-gray-300 rounded-md dark:text-dark dark:border-dark"><span class="sr-only">Press </span><kbd class="font-sans "><abbr class="no-underline ">Ctrl</abbr></kbd><span class="mx-1">+</span><span class="sr-only"> and </span><kbd class="font-sans ">K</kbd><span class="sr-only"> to search</span></span></div></div></div><div class="flex items-center mr-4 ml-4 sm:ml-2 lg:ml-6"><div class="dark:text-dark fill-gray-600"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 1024 1024" aria-label="auto icon"><path d="M512 992C246.92 992 32 777.08 32 512S246.92 32 512 32s480 214.92 480 480-214.92 480-480 480zm0-840c-198.78 0-360 161.22-360 360 0 198.84 161.22 360 360 360s360-161.16 360-360c0-198.78-161.22-360-360-360zm0 660V212c165.72 0 300 134.34 300 300 0 165.72-134.28 300-300 300z"></path></svg></div></div><div title="RSS 订阅" class="flex items-center  justify-center cursor-pointer hover:scale-125 transform transition-all mr-4 md:mr-4 lg:mr-4"><div class="dark:text-dark text-gray-600"><svg viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5489" width="20" height="20" fill="currentColor"><path d="M832.512 63.488q26.624 0 49.664 10.24t40.448 27.648 27.648 40.448 10.24 49.664l0 704.512q0 26.624-10.24 49.664t-27.648 40.448-40.448 27.648-49.664 10.24l-704.512 0q-26.624 0-49.664-10.24t-40.448-27.648-27.648-40.448-10.24-49.664l0-704.512q0-26.624 10.24-49.664t27.648-40.448 40.448-27.648 49.664-10.24l704.512 0zM188.416 923.648q19.456 0 36.864-7.168t30.208-19.968 19.968-30.208 7.168-36.864-7.168-36.864-19.968-30.208-30.208-19.968-36.864-7.168q-20.48 0-37.376 7.168t-30.208 19.968-20.48 30.208-7.168 36.864 7.168 36.864 20.48 30.208 30.208 19.968 37.376 7.168zM446.464 897.024l36.864 0q15.36 0 30.208 0.512t31.232 0.512 36.864-1.024q0-93.184-35.84-175.616t-97.28-143.872-143.872-96.768-175.616-35.328q-1.024 24.576-1.024 39.936l0 28.672q0 14.336 0.512 29.184t0.512 37.376q65.536 0 123.392 24.576t100.864 67.584 68.096 100.864 25.088 123.392zM707.584 894.976q36.864 0 49.152 0.512t18.432 1.536 15.872 1.024 41.472-2.048q0-145.408
1-55.296-272.896t-150.528-222.72-223.232-150.528-273.408-55.296q-1.024 25.6-1.024 36.864l0 16.384q0 4.096 0.512 5.632t0.512 7.168 0.512 18.432 0.512 40.448q119.808 0 224.768 45.056t183.296 123.392 123.392 183.296 45.056 223.744z" p-id="5490"></path></svg></div></div></div></div></div><div class="h-10 items-center hidden md:flex border-b border-gray-200 dark:border-nav-dark overflow-hidden"><div class="mx-5" style="width:52px"></div><ul class="flex h-full items-center text-sm text-gray-600 dark:text-dark "><li class="flex items-center h-full md:px-2 hover:text-gray-900 dark:hover:text-dark-hover transform hover:scale-110 cursor-pointer transition-all"><a href="/category/%E6%B5%8B%E8%AF%95%E5%BC%80%E5%8F%91"><div>测试开发</div></a></li><li class="flex items-center h-full md:px-2 hover:text-gray-900 dark:hover:text-dark-hover transform hover:scale-110 cursor-pointer transition-all"><a href="/category/adb"><div>adb</div></a></li><li class="flex items-center h-full md:px-2 hover:text-gray-900 dark:hover:text-dark-hover transform hover:scale-110 cursor-pointer transition-all"><a href="/category/redis"><div>redis</div></a></li><li class="flex items-center h-full md:px-2 hover:text-gray-900 dark:hover:text-dark-hover transform hover:scale-110 cursor-pointer transition-all"><a href="/category/chatgpt"><div>chatgpt</div></a></li><li class="flex items-center h-full md:px-2 hover:text-gray-900 dark:hover:text-dark-hover transform hover:scale-110 cursor-pointer transition-all"><a href="/category/python"><div>python</div></a></li><li class="flex items-center h-full md:px-2 hover:text-gray-900 dark:hover:text-dark-hover transform hover:scale-110 cursor-pointer transition-all"><a href="/category/%E6%B5%8B%E8%AF%95%E5%B7%A5%E5%85%B7"><div>测试工具</div></a></li><li class="flex items-center h-full md:px-2 hover:text-gray-900 dark:hover:text-dark-hover transform hover:scale-110 cursor-pointer transition-all"><a href="/category/%E5%BC%80%E6%BA%90%E9%A1%B9%E7%9B%AE"><div>开源项目</div></a></li><li class="flex items-center h-full md:px-2 hover:text-gray-900 dark:hover:text-dark-hover transform hover:scale-110 cursor-pointer transition-all"><a href="/category/git"><div>git</div></a></li></ul></div></div><div><div><div class="bm-overlay" style="position:fixed;z-index:1000;width:100%;height:100%;background:rgba(0, 0, 0, 0.3);opacity:0;-moz-transform:translate3d(100%, 0, 0);-ms-transform:translate3d(100%, 0, 0);-o-transform:translate3d(100%, 0, 0);-webkit-transform:translate3d(100%, 0, 0);transform:translate3d(100%, 0, 0);transition:opacity 0.3s, transform 0s 0.3s"></div><div id="nav-mobile" class="bm-menu-wrap" style="position:fixed;right:inherit;z-index:1100;width:300px;height:100%;-moz-transform:translate3d(-100%, 0, 0);-ms-transform:translate3d(-100%, 0, 0);-o-transform:translate3d(-100%, 0, 0);-webkit-transform:translate3d(-100%, 0, 0);transform:translate3d(-100%, 0, 0);transition:all 0.5s" aria-hidden="true"><div class="bm-menu" style="height:100%;box-sizing:border-box;overflow:auto"><nav class="bm-item-list" style="height:100%"><ul class="bm-item  sm:flex h-full items-center  text-sm text-gray-600 hidden divide-y divide-dashed dark:text-dark " style="display:block" tabindex="-1"><li class="side-bar-item dark:border-dark-2 dark:hover:bg-dark-2"><a href="/"><div class="w-full inline-block  px-4">首页</div></a></li><li class="side-bar-item dark:border-dark-2 dark:hover:bg-dark-2"><a href="/tag"><div class="w-full inline-block  px-4">标签</div></a></li><li class="side-bar-item dark:border-dark-2 dark:hover:bg-dark-2"><a href="/category"><div class="w-full inline-block  px-4">分类</div></a></li><li class="side-bar-item dark:border-dark-2 dark:hover:bg-dark-2"><a href="/timeline"><div class="w-full inline-block  px-4">时间线</div></a></li><li class="side-bar-item dark:border-dark-2 dark:hover:bg-dark-2"><a href="/link"><div class="w-full inline-block  px-4">友链</div></a></li><li class="side-bar-item dark:border-dark-2 dark:hover:bg-dark-2"><a href="/about"><div class="w-full inline-block  px-4">关于</div></a></li><li class="side-bar-item dark:border-dark-2 dark:hover:bg-dark-2"><a href="/post/24"><div class="w-full inline-block  px-4">UTX</div></a></li></ul></nav></div></div></div></div><div class=" mx-auto  lg:px-6  md:py-4 py-2 px-2 md:px-4  text-gray-700 "><div class="flex mx-auto justify-center"><div class="flex-shrink flex-grow md:max-w-3xl xl:max-w-4xl w-full vanblog-main"><div class="post-card-wrapper"><div style="position:relative" id="post-card" class="overflow-hidden post-card bg-white card-shadow py-4 px-1 sm:px-3 md:py-6 md:px-5 dark:bg-dark  dark:nav-shadow-dark"><div class="flex justify-center post-card-title "><a target="_self" style="width:90%" title="UTX 自动化工具介绍" href="/post/24"><div class="text-lg block font-medium overflow-hidden text-ellipsis whitespace-nowrap px-5  text-center mb-2 mt-2 dark:text-dark text-gray-700  md:text-2xl ua ua-link">UTX 自动化工具介绍</div></a></div><div class="text-center text-xs md:text-sm divide-x divide-gray-400 text-gray-400 dark:text-dark post-card-sub-title"><span class="inline-flex px-2 items-center"><span class="mr-1 fill-gray-400 dark:text-dark dark:group-hover:text-dark-h
1over group-hover:text-gray-900 "><svg viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="11557" width="16" height="16"><path d="M853.333333 501.333333c-17.066667 0-32 14.933333-32 32v320c0 6.4-4.266667 10.666667-10.666666 10.666667H170.666667c-6.4 0-10.666667-4.266667-10.666667-10.666667V213.333333c0-6.4 4.266667-10.666667 10.666667-10.666666h320c17.066667 0 32-14.933333 32-32s-14.933333-32-32-32H170.666667c-40.533333 0-74.666667 34.133333-74.666667 74.666666v640c0 40.533333 34.133333 74.666667 74.666667 74.666667h640c40.533333 0 74.666667-34.133333 74.666666-74.666667V533.333333c0-17.066667-14.933333-32-32-32z" p-id="11558"></path><path d="M405.333333 484.266667l-32 125.866666c-2.133333 10.666667 0 23.466667 8.533334 29.866667 6.4 6.4 14.933333 8.533333 23.466666 8.533333h8.533334l125.866666-32c6.4-2.133333 10.666667-4.266667 14.933334-8.533333l300.8-300.8c38.4-38.4 38.4-102.4 0-140.8-38.4-38.4-102.4-38.4-140.8 0L413.866667 469.333333c-4.266667 4.266667-6.4 8.533333-8.533334 14.933334z m59.733334 23.466666L761.6 213.333333c12.8-12.8 36.266667-12.8 49.066667 0 12.8 12.8 12.8 36.266667 0 49.066667L516.266667 558.933333l-66.133334 17.066667 14.933334-68.266667z" p-id="11559"></path></svg></span>2023-11-02</span><span class="inline-flex px-2 items-center group dark:group cursor-pointer"><span class="mr-1 fill-gray-400 dark:text-dark dark:group-hover:text-dark-hover group-hover:text-gray-900 "><svg viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="12516" fill="currentColor" width="16" height="16"><path d="M810.666667 85.333333a85.333333 85.333333 0 0 1 85.333333 85.333334v152.021333c36.821333 9.493333 64 42.88 64 82.645333v405.333334a128 128 0 0 1-128 128H192a128 128 0 0 1-128-128V298.666667a85.376 85.376 0 0 1 64-82.645334V170.666667a85.333333 85.333333 0 0 1 85.333333-85.333334h597.333334zM128.149333 296.170667L128 298.666667v512a64 64 0 0 0 60.245333 63.893333L192 874.666667h640a64 64 0 0 0 63.893333-60.245334L896 810.666667V405.333333a21.333333 21.333333 0 0 0-18.837333-21.184L874.666667 384H638.165333l-122.069333-101.717333a21.333333 21.333333 0 0 0-10.688-4.736l-2.986667-0.213334H149.333333a21.333333 21.333333 0 0 0-21.184 18.837334zM535.189333 213.333333l127.978667 106.666667H832V170.666667a21.333333 21.333333 0 0 0-18.837333-21.184L810.666667 149.333333H213.333333a21.333333 21.333333 0 0 0-21.184 18.837334L192 170.666667v42.666666h343.168z" p-id="12517"></path></svg></span><a target="_blank" href="/category/%E5%BC%80%E6%BA%90%E9%A1%B9%E7%9B%AE"><div class="cursor-pointer group-hover:text-gray-900 dark:group-hover:text-dark-hover hover:font-medium ">开源项目</div></a></span><span class="inline-flex px-2 items-center"><span class="mr-1 fill-gray-400 dark:text-dark dark:group-hover:text-dark-hover group-hover:text-gray-900 "><svg viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="15825" width="16" height="16"><path d="M942.2 486.2C847.4 286.5 704.1 186 512 186c-192.2 0-335.4 100.5-430.2 300.3-7.7 16.2-7.7 35.2 0 51.5C176.6 737.5 319.9 838 512 838c192.2 0 335.4-100.5 430.2-300.3 7.7-16.2 7.7-35 0-51.5zM512 766c-161.3 0-279.4-81.8-362.7-254C232.6 339.8 350.7 258 512 258c161.3 0 279.4 81.8 362.7 254C791.5 684.2 673.4 766 512 766z" p-id="15826"></path><path d="M508 336c-97.2 0-176 78.8-176 176s78.8 176 176 176 176-78.8 176-176-78.8-176-176-176z m0 288c-61.9 0-112-50.1-112-112s50.1-112 112-112 112 50.1 112 112-50.1 112-112 112z" p-id="15827"></path></svg></span><span>0</span></span><span class="inline-flex px-2 items-center"><span class="mr-1 fill-gray-400 dark:text-dark dark:group-hover:text-dark-hover group-hover:text-gray-900 "><svg viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="13953" width="16" height="16"><path d="M873.559 97.82h-723.12c-45.886 0-83.436 37.627-83.436 83.611v542.098c0 45.984 37.55 69.685 83.437 69.685h333.747c45.888 0 109.987 34.242 142.43 66.767l48.888 52.12c12.589 12.615 24.309 20.262 33.91 20.262 15.143 0 25.083-20.55 25.083-48.675 0-45.983 37.548-90.474 83.436-90.474h55.625c45.887 0 83.438-23.701 83.438-69.685V181.431c0-45.984-37.55-83.61-83.438-83.61z m27.813 625.71c0 15.105-12.738 15.307-27.813 15.307h-55.625c-61.382 0-113.612 46.353-132 101.74l-19.989-23.15c-42.914-43.016-121.055-78.59-181.758-78.59H150.44c-15.074 0-27.813
1-0.204-27.813-15.308V181.431c0-15.106 12.739-27.87 27.813-27.87h723.119c15.075 0 27.813 12.766 27.813 27.87v542.098zM261.689 348.652h278.124c15.358 0 27.812-12.48 27.812-27.87s-12.454-27.87-27.812-27.87H261.689c-15.357 0-27.812 12.48-27.812 27.87s12.455 27.87 27.812 27.87z m472.81 83.613H261.69c-15.357 0-27.812 12.48-27.812 27.87s12.455 27.87 27.812 27.87H734.5c15.357 0 27.812-12.48 27.812-27.87 0-15.392-12.455-27.87-27.812-27.87z m0 111.48H261.69c-15.357 0-27.812 12.48-27.812 27.87s12.455 27.871 27.812 27.871H734.5c15.357 0 27.812-12.48 27.812-27.87s-12.455-27.87-27.812-27.87z" p-id="13954"></path></svg></span><span class="waline-comment-count" data-path="/post/24">0</span></span></div><div class="text-sm md:text-base  text-gray-600 mt-4 mx-2"><div class="warning-card text-gray-600 dark:text-dark"><div>请注意,本文编写于 <!-- -->1064<!-- --> 天前,最后修改于<!-- --> <!-- -->1064<!-- --> <!-- -->天前,其中某些信息可能已经过时。</div></div><div class="block lg:hidden toc-mobile"><div class="relative" style="position:relative"><h2 style="font-weight:600;font-size:1.5em;margin-bottom:4px" class="text-gray-700 dark:text-dark ">目录</h2><div class="markdown-navigation" style="position:relative"><div class="title-anchor title-level1 ">UTX</div><div class="title-anchor title-level2 ">logo</div><div class="title-anchor title-level2 ">安装</div><div class="title-anchor title-level2 ">设计理念</div><div class="title-anchor title-level2 ">项目结构</div><div class="title-anchor title-level2 ">
1调用流程图</div><div class="title-anchor title-level2 ">专注于写脚本</div><div class="title-anchor title-level2 ">轻封装</div><div class="title-anchor title-level2 ">核心价值</div><div class="title-anchor title-level2 ">功能介绍</div><div class="title-anchor title-level2 ">app使用说明</div><div class="title-anchor title-level2 ">web使用说明</div><div class="title-anchor title-level2 ">运行结果</div></div><div style="margin-bottom:10px;margin-top:-2px"></div></div></div><div class="markdown-body"><div class="markdown-body"><h1 data-id="UTX" id="UTX" class="markdown-heading cursor-pointer">UTX</h1>
2<p><img src="/static/img/2f3288b09886e468ea84fb706e009507.image.webp" alt="image.png" class="undefined img-zoom"></p>
3<h2 data-id="logo" id="logo" class="markdown-heading cursor-pointer">logo</h2>
4<p><img src="/static/img/7b7d9d5a2ce791979470c6edbb285846.clipboard-2023-10-24.webp" alt="image.png" class="undefined img-zoom"></p>
5<h2 data-id="安装" id="安装" class="markdown-heading cursor-pointer">安装</h2>
6<ul>
7<li>命令行执行</li>
8</ul>
9<pre><div class="code-block-wrapper relative"><div class="header-right flex" style="color: #6f7177"><span class="language-tag mr-1" style="line-height: 21px"></span><div class="code-copy-btn"></div></div><code class="code-inline">pip install -U utx
10</code></div></pre>
11<h2 data-id="设计理念" id="设计理念" class="markdown-heading cursor-pointer">设计理念</h2>
12<p>很大程度上借鉴了HttpRunner(优秀的框架)。不同的是,utx更着重写python,而不是写yaml文件。</p>
13<ul>
14<li>简单是更好的</li>
15<li>每个人都能用python写自动化</li>
16<li>UI自动化跟的上冲刺迭代和UI变更</li>
17</ul>
18<p>这就是utx的设计理念。</p>
19<h2 data-id="项目结构" id="项目结构" class="markdown-heading cursor-pointer">项目结构</h2>
20<p><img src="/static/img/28a69fb200577aa4ba8dad2e9c04f680.image.webp" alt="image.png" class="undefined img-zoom"></p>
21<ul>
22<li>utx提供了快速创建项目的能力,也就是脚手架。</li>
23<li>【app脚手架】</li>
24</ul>
25<pre><div class="code-block-wrapper relative"><div class="header-right flex" style="color: #6f7177"><span class="language-tag mr-1" style="line-height: 21px">shell</span><div class="code-copy-btn"></div></div><code class="hljs language-shell">utx startproject project_name
26</code></div></pre>
27<ul>
28<li>【web脚手架】</li>
29</ul>
30<pre><div class="code-block-wrapper relative"><div class="header-right flex" style="color: #6f7177"><span class="language-tag mr-1" style="line-height: 21px">shell</span><div class="code-copy-btn"></div></div><code class="hljs language-shell">utx startproject-web project_name
31</code></div></pre>
32<pre><div class="code-block-wrapper relative"><div class="header-right flex" style="color: #6f7177"><span class="language-tag mr-1" style="line-height: 21px">text</span><div class="code-copy-btn"></div></div><code class="hljs language-text">$ utx startproject demo
332021-09-01 12:39:16.491 | INFO     | utx.cli.scaffold:create_scaffold:51 - Create new project: demo
34Project root dir: /PycharmProjects/demo
35
36Created folder: demo
37Created folder: demo/config
38Created folder: demo/logs
39Created folder: demo/packages
40Created folder: demo/report/airtest
41Created folder: demo/tests
42Created folder: demo/suites
43Created file: demo/.gitignore
44Created file: demo/conftest.py
45Created file: demo/pytest.ini
46Created file: demo/run.py
47Created file: demo/requirements.txt
48Created file: demo/config/conf.py
49Created file: demo/config/config.ini
50Created file: demo/config/__init__.py
51Created file: demo/tests/test_devices.py
52Created file: demo/tests/__init__.py
53Created file: demo/report/summary_template.html
54
55</code></div></pre>
56<h2 data-id="调用流程图" id="调用流程图" class="markdown-heading cursor-pointer">
56调用流程图</h2>
57<p><img src="/static/img/375c2c897ffac4f5d8505f0d1d9cb3dd.image.webp" alt="image.png" class="undefined img-zoom"></p>
58<h2 data-id="专注于写脚本" id="专注于写脚本" class="markdown-heading cursor-pointer">专注于写脚本</h2>
59<ul>
60<li>项目结构很清晰。在conftest.py进行一些初始化/参数化/清理工作,在suites/写测试脚本。</li>
61</ul>
62<blockquote>
63<p>在AirtestIDE中写好.air脚本,然后将文件放到suites文件中。</p>
64</blockquote>
65<ul>
66<li>更注重平铺写脚本的方式,这样就离“每个人都能用python写自动化”更近一步。毕竟封装之后看着容易晕,我也晕。</li>
67<li>去除掉框架的约束,给每个人写python的自由,在测试脚本里你可以尽情发挥你的代码风格,代码能力,千人千面。代价呢,就是代码质量参差不齐。</li>
68</ul>
69<p>大胆写,能写,写出来,跑通,就已经是在写自动化,就已经是在创造价值了!</p>
70<h2 data-id="轻封装" id="轻封装" class="markdown-heading cursor-pointer">轻封装</h2>
71<p>utx尊重原生用法。</p>
72<p>airtest的封装只通过装饰器进行了运行方式的调整,没有做任何其他的冗余修改。</p>
73<ul>
74<li>faker,造数据工具</li>
75<li>pytest,测试框架</li>
76<li>airtest,自动化测试工具</li>
77<li>tidevice,iOS设备管理工具</li>
78<li>pandas、numpy,数据处理工具</li>
79</ul>
80<p>安装utx,自动就把这些开源利器安装上了,无需单独安装。未来会集成更多实用工具到utx中。</p>
81<p>utx本身是很轻的。</p>
82<h2 data-id="核心价值" id="核心价值" class="markdown-heading cursor-pointer">核心价值</h2>
83<ul>
84<li>上手 0 门槛,iOS/Android 设备均实现即插即用,随写随调</li>
85<li>测试用例可读性高,编写成本低,支持python语法,便于公共操作抽象,进一步提高用例可维护性</li>
86<li>用例执行高鲁棒性,多设备机型切换无需更改用例适配</li>
87<li>执行集创建简单,支持智能并发、分组单模块执行,更高效更灵活</li>
88</ul>
89<h2 data-id="功能介绍" id="功能介绍" class="markdown-heading cursor-pointer">功能介绍</h2>
90<ol>
91<li>支持android,ios,web 平台的自动化测试框架</li>
92<li>脚本批量执行</li>
93<li>每个脚本执行日志分开存放</li>
94<li>每个脚本单独生成一个html报告并在父文件夹生成一个聚合报告</li>
95<li>自定义的聚合报告,详细展示运行结果</li>
96<li>重试机制,运行失败自动重跑,可自定义重跑次数</li>
97<li>自定义脚本运行,可选择部分模块单独运行</li>
98<li>自带脚手架工具可以快速生成框架目录</li>
99</ol>
100<h2 data-id="app使用说明" id="app使用说明" class="markdown-heading cursor-pointer">app使用说明</h2>
101<ul>
102<li>只需在配置文件中填好相关内容,即可运行!</li>
103</ul>
104<pre><div class="code-block-wrapper relative"><div class="header-right flex" style="color: #6f7177"><span class="language-tag mr-1" style="line-height: 21px">ini</span><div class="code-copy-btn"></div></div><code class="hljs language-ini"><span class="hljs-section">[device_info]</span>
105<span class="hljs-comment">;设备远程链接URL 设备ip+端口或者设备唯一标识id,多个设备以,分割;例如 设备1,设备2,设备3</span>
106<span class="hljs-attr">device</span> = <span class="hljs-number">127.0</span>.<span class="hljs-number">0.1</span>:<span class="hljs-number">5555</span>
107<span class="hljs-comment">;设备平台iOS或者Android</span>
108<span class="hljs-attr">platform</span> = android
109<span class="hljs-comment">;ios设备驱动包名,仅测试iOS时需要</span>
110<span class="hljs-attr">wda</span> = com.facebook.WebDriverAgentRunner.utx.xctrunner
111<span class="hljs-comment">;是否执行安装卸载操作 True/False</span>
112<span class="hljs-attr">init</span> = <span class="hljs-literal">False</span>
113
114<span class="hljs-section">[app_info]</span>
115<span class="hljs-comment">;app包名</span>
116<span class="hljs-attr">package</span> = com.wx.mp.test
117<span class="hljs-comment">;apk或者ipa文件名</span>
118<span class="hljs-attr">filename</span> = app_test.apk
119
120<span class="hljs-section">[reruns]</span>
121<span class="hljs-comment">;失败后再次运行次数,默认1次</span>
122<span class="hljs-attr">times</span> = <span class="hljs-number">1</span>
123
124<span class="hljs-section">[paths]</span>
125<span class="hljs-comment">;
125自定义执行case目录层级,文件夹名称(例如:smoke),默认为空</span>
126<span class="hljs-attr">name</span> = 
127
128<span class="hljs-section">[mode]</span>
129<span class="hljs-comment">;False 表示 运行[suites][cases]选择的用例,True表示运行全部用例</span>
130<span class="hljs-attr">is_all</span> = <span class="hljs-literal">True</span>
131<span class="hljs-comment">;是否录制视频 True/False</span>
132<span class="hljs-attr">record</span> = <span class="hljs-literal">False</span>
133
134<span class="hljs-section">[suites]</span>
135<span class="hljs-comment">;填写用例的关键字</span>
136<span class="hljs-attr">cases</span> = test.air
137</code></div></pre>
138<ul>
139<li>app启动命令</li>
140</ul>
141<ol>
142<li>普通启动</li>
143</ol>
144<pre><div class="code-block-wrapper relative"><div class="header-right flex" style="color: #6f7177"><span class="language-tag mr-1" style="line-height: 21px">shell</span><div class="code-copy-btn"></div></div><code class="hljs language-shell">python run.py
145</code></div></pre>
146<ol start="2">
147<li>参数化启动</li>
148</ol>
149<pre><div class="code-block-wrapper relative"><div class="header-right flex" style="color: #6f7177"><span class="language-tag mr-1" style="line-height: 21px">shell</span><div class="code-copy-btn"></div></div><code class="hljs language-shell"><span class="hljs-meta prompt_"># </span><span class="bash">Android</span>
150python run.py --platform=Android --device=127.0.0.1:5555 --init=True
151<span class="hljs-meta prompt_"># </span><span class="bash">iOS</span>
152python run.py --platform=iOS --wda=com.facebook.WebDriverAgentRunner.utx.xctrunner --init=True
153</code></div></pre>
154<blockquote>
155<p>参数优先级大于配置文件</p>
156<blockquote>
157<p>多个设备以,分割; 例如 python run.py --platform=Android --device=设备1,设备2,设备3 --init=True</p>
158</blockquote>
159</blockquote>
160<h2 data-id="web使用说明" id="web使用说明" class="markdown-heading cursor-pointer">web使用说明</h2>
161<ul>
162<li>无需关注 chrome浏览器驱动</li>
163</ul>
164<blockquote>
165<p>注意:无需配置 chromedriver ,系统会自动化维护匹配版本。</p>
166</blockquote>
167<ul>
168<li>只需在配置文件中填好相关内容,即可运行!</li>
169</ul>
170<pre><div class="code-block-wrapper relative"><div class="header-right flex" style="color: #6f7177"><span class="language-tag mr-1" style="line-height: 21px">ini</span><div class="code-copy-btn"></div></div><code class="hljs language-ini"><span class="hljs-section">[web_info]</span>
171<span class="hljs-comment">;被测的主页url</span>
172<span class="hljs-attr">url</span> = https://www.baidu.com/
173<span class="hljs-comment">;是否无界面运行</span>
174<span class="hljs-attr">headless</span> = <span class="hljs-literal">False</span>
175
176<span class="hljs-section">[reruns]</span>
177<span class="hljs-comment">;失败后再次运行次数,默认1次</span>
178<span class="hljs-attr">times</span> = <span class="hljs-number">1</span>
179
180<span class="hljs-section">[paths]</span>
181<span class="hljs-comment">;自定义执行case目录层级,文件夹名称(例如:smoke),默认为空</span>
182<span class="hljs-attr">name</span> = 
183
184<span class="hljs-section">[mode]</span>
185<span class="hljs-comment">;False 表示 运行[suites][cases]选择的用例,True表示运行全部用例</span>
186<span class="hljs-attr">is_all</span> = <span class="hljs-literal">True</span>
187
188<span class="hljs-section">[suites]</span>
189<span class="hljs-comment">;填写用例的关键字</span>
190<span class="hljs-attr">cases</span> = chrome
191
192</code></div></pre>
193<ul>
194<li>web启动命令</li>
195</ul>
196<ol>
197<li>普通启动</li>
198</ol>
199<pre><div class="code-block-wrapper relative"><div class="header-right flex" style="color: #6f7177"><span class="language-tag mr-1" style="line-height: 21px">shell</span><div class="code-copy-btn"></div></div><code class="hljs language-shell">python run.py
200</code></div></pre>
201<ol start="2">
202<li>参数化启动</li>
203</ol>
204<pre><div class="code-block-wrapper relative"><div class="header-right flex" style="color: #6f7177"><span class="language-tag mr-1" style="line-height: 21px">shell</span><div class="code-copy-btn"></div></div><code class="hljs language-shell">python run.py --headless=True --driver=/Users/admin/driverpath
205</code></div></pre>
206<blockquote>
207<p>参数优先级大于配置文件</p>
208</blockquote>
209<h2 data-id="运行结果" id="运行结果" class="markdown-heading cursor-pointer">运行结果</h2>
210<ul>
211<li>报告展示</li>
212</ul>
213<p><img src="/static/img/bc6387d7b9f720991dd9e0aa5a007ae7.image.webp" alt="image.png" class="undefined img-zoom"></p></div></div></div><div class="mt-8"><div class="text-center  select-none text-sm md:text-base mb-2 dark:text-dark">如果对你有用的话,可以打赏哦</div><div class="flex justify-center mb-6 "><div class="text-sm md:text-base   text-gray-100 bg-red-600 rounded px-4 select-none cursor-pointer hover:bg-red-400 py-1">打赏</div></div><div class=" justify-center overflow-hidden transition-all" style="max-height:0px;margin-bottom:0"><div class="flex justify-center"><img alt="ali pay" src="https://openutx.cn/static/img/22dce95a52ba05dfde3eaf8e6834fafe.IMG_7229.webp" width="180" height="250"/><div class="w-4 inline-block"></div><img alt="wechat pay" src="https://openutx.cn/static/img/cb6ed61087eb2918e9f3ed8ac36e1262.IMG_7228.webp" width="180" height="250"/></div></div></div><div class="bg-gray-100 px-5 border-l-4 border-red-500  py-2 text-sm space-y-1 dark:text-dark  dark:bg-dark "><p><span class="mr-2">本文作者:</span><span>李佳玮</span></p><p><span class="mr-2">本文链接:</span><span class="cursor-pointer border-b border-gray-100 hover:border-gray-500 dark:text-dark dark-border-hover dark:border-nav-dark" style="word-break:break-all"></span></p><p><span class="mr-2">版权声明:</span><span>本博客所有文章除特别声明外,均采用 BY-NC-SA
214    许可协议。转载请注明出处!</span></p></div><div class="mt-4"><div class="text-sm flex-wrap text-gray-500 flex justify-center space-x-2 select-none dark:text-dark"><div><a target="_blank" href="/tag/%E5%BC%80%E6%BA%90%E9%A1%B9%E7%9B%AE"><div class=" border-b border-white hover:border-gray-500 dark:border-dark dark:hover:border-gray-300 dark:hover:text-gray-300">开源项目</div></a></div></div><hr class="mt-3 dark:border-hr-dark"/><div class="flex justify-between text-sm mt-2 whitespace-nowrap overflow-hidden "><div class="" style="max-width:50%"><a target="_blank" href="/post/23"><div style="white-space:break-spaces" class="dark:text-dark dark:border-dark dark-border-hover border-b pb border-dashed hover:border-gray-800 border-white hover:text-gray-800">&lt; 给我的公众号添加了一个AI机器人~</div></a></div><div class="" style="max-width:50%"><a target="_blank" href="/post/25"><div style="white-space:break-spaces" class="dark:text-dark dark:border-dark  dark-border-hover border-b pb border-dashed hover:border-gray-800 border-white hover:text-gray-800">如何在Python包中控制只允许特定Python版本使用 &gt;</div></a></div></div></div><div style="height:0"></div></div></div></div><div class="hidden lg:block flex-shrink-0 flex-grow-0 vanblog-sider w-52"><div class="sticky" id="toc-card"><div id="toc-container" class="bg-white w-60 card-shadow dark:card-shadow-dark ml-2 dark:bg-dark overflow-y-auto pb-2" style="max-height:calc(100vh - 200px)"><div class="relative" style="position:relative">
214<div class="text-center text-lg font-medium mt-4 text-gray-700 dark:text-dark cursor-pointer">目录</div><div class="markdown-navigation" style="position:relative"><div class="title-anchor title-level1 ">UTX</div><div class="title-anchor title-level2 ">logo</div><div class="title-anchor title-level2 ">安装</div><div class="title-anchor title-level2 ">设计理念</div><div class="title-anchor title-level2 ">项目结构</div><div class="title-anchor title-level2 ">调用流程图</div><div class="title-anchor title-level2 ">专注于写脚本</div><div class="title-anchor title-level2 ">轻封装</div><div class="title-anchor title-level2 ">核心价值</div><div class="title-anchor title-level2 ">功能介绍</div><div class="title-anchor title-level2 ">app使用说明</div><div class="title-anchor title-level2 ">web使用说明</div><div class="title-anchor title-level2 ">运行结果</div></div><div style="margin-bottom:10px;margin-top:-2px"></div></div></div></div></div></div><footer class="text-center text-sm space-y-1 mt-8 md:mt-12 dark:text-dark footer-icp-number"><p class="">ICP 编号: <a href="https://beian.miit.gov.cn/" target="_blank" class="hover:text-gray-900 hover:underline-offset-2 hover:underline dark:hover:text-dark-hover transition">晋ICP备2023021831号-1</a></p><p class="flex justify-center items-center footer-gongan-beian">公安备案: <img src="https://openutx.cn/static/img/7c1b2ba07fa422f609484f6edef4205b.beian.webp" alt="公安备案 logo" width="20" loading="lazy"/><a href="https://beian.mps.gov.cn/#/query/webSearch?code=11011402053524" target="_blank" class="hover:text-gray-900 hover:underline-offset-2 hover:underline dark:hover:text-dark-hover transition">  京公网安备11011402053524号</a></p><p><span>本站居然运行了</span><span></span></p><p class="footer-powered-by-vanblog">Powered By <a href="https://vanblog.mereith.com" target="_blank" class="hover:text-gray-900 dark:hover:text-dark-hover transition ua ua-link">VanBlog <span>v0.54.0</span></a></p><p class="select-none footer-copy-right">© <!-- -->2023<!-- --> - <!-- -->2026</p><p class="select-none footer-viewer"><span class="flex justify-center items-center dark:text-dark fill-gray-600 divide-gray-600"><span class="flex items-center justify-center pr-2"><span><svg viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="7211" width="14" height="14"><path d="M565.2 521.9c76.2-23 132.1-97.6 132.1-186.2 0-106.9-81.3-193.5-181.6-193.5s-181.6 86.6-181.6 193.5c0 87.6 54.6 161.6 129.5 185.4-142.2 23.1-250.8 146.5-250.8 295.3 0 2.9 0 5.8 0.1 8.7 0.9 31.5 26.5 56.7 58.1 56.7h482.1c31.2 0 57-24.6 58-55.8 0.1-3.2 0.2-6.4 0.2-9.6-0.1-147.1-106.2-269.4-246.1-294.5z" p-id="7212"></path></svg></span> <!-- -->0</span><span class="flex items-center justify-center pl-2"><span><svg viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="9714" width="14" height="14"><path d="M508 512m-112 0a112 112 0 1 0 224 0 112 112 0 1 0-224 0Z" p-id="9715"></path><path d="M942.2 486.2C847.4 286.5 704.1 186 512 186c-192.2 0-335.4 100.5-430.2 300.3-7.7 16.2-7.7 35.2 0 51.5C176.6 737.5 319.9 838 512 838c192.2 0 335.4-100.5 430.2-300.3 7.7-16.2 7.7-35 0-51.5zM508 688c-97.2 0-176-78.8-176-176s78.8-176 176-176 176 78.8 176 176-78.8 176-176 176z" p-id="9716"></path></svg></span>0</span></span></p></footer></div><div>
214<script src="https://gcore.jsdelivr.net/gh/stevenjoezhang/live2d-widget@latest/autoload.js"></script>
214
215<div id="sakana-widget" style="position: fixed;bottom: 20px;right:40px;"></div>
216<script>
217  function initSakanaWidget() {
218    new SakanaWidget({ autoFit: true })
219      .setState({ i: 0.001, d: 1 })
220      .mount("#sakana-widget");
221  }
222</script>
vendor: 1 bytes, line 222
222
223<script
224  async
225  onload="initSakanaWidget()"
226  src="https://gcore.jsdelivr.net/npm/[email protected]/lib/sakana.min.js"
227></script>
227</div></div>
227<script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{"layoutProps":{"showFriends":"true","version":"v0.54.0","subMenuOffset":0,"showAdminButton":"false","headerLeftContent":"siteName","copyrightAggreement":"BY-NC-SA","ipcHref":"https://beian.miit.gov.cn/","ipcNumber":"晋ICP备2023021831号-1","gaBeianNumber":"  京公网安备11011402053524号","gaBeianLogoUrl":"https://openutx.cn/static/img/7c1b2ba07fa422f609484f6edef4205b.beian.webp","gaBeianUrl":"https://beian.mps.gov.cn/#/query/webSearch?code=11011402053524","since":"2023-09-26T09:04:30.566Z","logo":"https://openutx.cn/static/img/c33b34619bc47966f93b4530f4afb658.pic.webp","favicon":"https://openutx.cn/static/img/c33b34619bc47966f93b4530f4afb658.pic.webp","siteName":"每日测试技术分享","siteDesc":" 李佳玮【测试开发囤货】,专注于测试开发领域技术分享。","baiduAnalysisID":"","gaAnalysisID":"","logoDark":"","showExpirationReminder":"true","description":" 李佳玮【测试开发囤货】,专注于测试开发领域技术分享。","menus":[{"id":0,"name":"首页","value":"/","level":0},{"id":1,"name":"标签","value":"/tag","level":0},{"id":2,"name":"分类","value":"/category","level":0},{"id":3,"name":"时间线","value":"/timeline","level":0},{"id":4,"name":"友链","value":"/link","level":0},{"id":5,"name":"关于","value":"/about","level":0},{"id":1698146933978,"level":0,"name":"UTX","value":"/post/24"}],"categories":["测试开发","adb","redis","chatgpt","python","测试工具","开源项目","git"],"showSubMenu":"true","enableComment":"true","defaultTheme":"auto","openArticleLinksInNewWindow":"true","showCopyRight":"true","showDonateButton":"true","showRSS":"true","showEditButton":"false","enableCustomizing":"true","customHtml":"PHNjcmlwdCBzcmM9Imh0dHBzOi8vZ2NvcmUuanNkZWxpdnIubmV0L2doL3N0ZXZlbmpvZXpoYW5nL2xpdmUyZC13aWRnZXRAbGF0ZXN0L2F1dG9sb2FkLmpzIj48L3NjcmlwdD4KPGRpdiBpZD0ic2FrYW5hLXdpZGdldCIgc3R5bGU9InBvc2l0aW9uOiBmaXhlZDtib3R0b206IDIwcHg7cmlnaHQ6NDBweDsiPjwvZGl2Pgo8c2NyaXB0PgogIGZ1bmN0aW9uIGluaXRTYWthbmFXaWRnZXQoKSB7CiAgICBuZXcgU2FrYW5hV2lkZ2V0KHsgYXV0b0ZpdDogdHJ1ZSB9KQogICAgICAuc2V0U3RhdGUoeyBpOiAwLjAwMSwgZDogMSB9KQogICAgICAubW91bnQoIiNzYWthbmEtd2lkZ2V0Iik7CiAgfQo8L3NjcmlwdD4KPHNjcmlwdAogIGFzeW5jCiAgb25sb2FkPSJpbml0U2FrYW5hV2lkZ2V0KCkiCiAgc3JjPSJodHRwczovL2djb3JlLmpzZGVsaXZyLm5ldC9ucG0vc2FrYW5hLXdpZGdldEAyLjIuMi9saWIvc2FrYW5hLm1pbi5qcyIKPjwvc2NyaXB0Pg==","customHead":[]},"article":{"title":"UTX 自动化工具介绍","content":"# UTX\n\n![image.png](/static/img/2f3288b09886e468ea84fb706e009507.image.webp)\n## logo\n\n![image.png](/static/img/7b7d9d5a2ce791979470c6edbb285846.clipboard-2023-10-24.webp)\n## 安装\n- 命令行执行\n```\npip install -U utx\n```\n\n\n## 设计理念\n\n很大程度上借鉴了HttpRunner(优秀的框架)。不同的是,utx更着重写python,而不是写yaml文件。\n\n- 简单是更好的\n- 每个人都能用python写自动化\n- UI自动化跟的上冲刺迭代和UI变更\n\n\n这就是utx的设计理念。\n\n\u003c!-- more --\u003e\n\n\n## 项目结构\n\n![image.png](/static/img/28a69fb200577aa4ba8dad2e9c04f680.image.webp)\n\n- utx提供了快速创建项目的能力,也就是脚手架。\n- 【app脚手架】\n```shell\nutx startproject project_name\n```\n- 【web脚手架】\n```shell\nutx startproject-web project_name\n```\n```text\n$ utx startproject demo\n2021-09-01 12:39:16.491 | INFO     | utx.cli.scaffold:create_scaffold:51 - Create new project: demo\nProject root dir: /PycharmProjects/demo\n\nCreated folder: demo\nCreated folder: demo/config\nCreated folder: demo/logs\nCreated folder: demo/packages\nCreated folder: demo/report/airtest\nCreated folder: demo/tests\nCreated folder: demo/suites\nCreated file: demo/.gitignore\nCreated file: demo/conftest.py\nCreated file: demo/pytest.ini\nCreated file: demo/run.py\nCreated file: demo/requirements.txt\nCreated file: demo/config/conf.py\nCreated file: demo/config/config.ini\nCreated file: demo/config/__init__.py\nCreated file: demo/tests/test_devices.py\nCreated file: demo/tests/__init__.py\nCreated file: demo/report/summary_template.html\n\n```\n## 调用流ç¨
227‹å›¾\n\n\n![image.png](/static/img/375c2c897ffac4f5d8505f0d1d9cb3dd.image.webp)\n\n## 专注于写脚本\n\n- 项目结构很清晰。在conftest.py进行一些初始化/参数化/清理工作,在suites/写测试脚本。\n\u003e在AirtestIDE中写好.air脚本,然后将文件放到suites文件中。\n- 更注重平铺写脚本的方式,这样就离“每个人都能用python写自动化”更近一步。毕竟封装之后看着容易晕,我也晕。\n- 去除掉框架的约束,给每个人写python的自由,在测试脚本里你可以尽情发挥你的代码风格,代码能力,千人千面。代价呢,就是代码质量参差不齐。\n\n大胆写,能写,写出来,跑通,就已经是在写自动化,就已经是在创造价值了!\n\n\n## 轻封装\n\nutx尊重原生用法。\n\nairtest的封装只通过装饰器进行了运行方式的调整,没有做任何其他的冗余修改。\n\n- faker,造数据工具\n- pytest,测试框架\n- airtest,自动化测试工具\n- tidevice,iOS设备管理工具\n- pandas、numpy,数据处理工具\n\n安装utx,自动就把这些开源利器安装上了,无需单独安装。未来会集成更多实用工具到utx中。\n\nutx本身是很轻的。\n\n## 核心价值\n\n- 上手 0 门槛,iOS/Android 设备均实现即插即用,随写随调\n- 测试用例可读性高,编写成本低,支持python语法,便于公共操作抽象,进一步提高用例可维护性\n- 用例执行高鲁棒性,多设备机型切换无需更改用例适配\n- 执行集创建简单,支持智能并发、分组单模块执行,更高效更灵活\n\n## 功能介绍\n\n1. 支持android,ios,web 平台的自动化测试框架\n2. 脚本批量执行\n3. 每个脚本执行日志分开存放\n4. 每个脚本单独生成一个html报告并在父文件夹生成一个聚合报告\n5. 自定义的聚合报告,详细展示运行结果\n6. 重试机制,运行失败自动重跑,可自定义重跑次数\n7. 自定义脚本运行,可选择部分模块单独运行\n8. 自带脚手架工具可以快速生成框架目录\n\n\n## app使用说明\n\n- 只需在配置文件中填好相关内容,即可运行!\n```ini\n[device_info]\n;设备远程链接URL 设备ip+端口或者设备唯一标识id,多个设备以,分割;例如 设备1,设备2,设备3\ndevice = 127.0.0.1:5555\n;设备平台iOS或者Android\nplatform = android\n;ios设备驱动包名,仅测试iOS时需要\nwda = com.facebook.WebDriverAgentRunner.utx.xctrunner\n;是否执行安装卸载操作 True/False\ninit = False\n\n[app_info]\n;app包名\npackage = com.wx.mp.test\n;apk或者ipa文件名\nfilename = app_test.apk\n\n[reruns]\n;失败后再次运行次数,默认1次\ntimes = 1\n\n[paths]\n;自定义执行case目录层级,文件夹名称(例如:smoke),默认为空\nname = \n\n[mode]\n;False 表示 运行[suites][cases]选择的用例,True表示运行全部用例\nis_all = True\n;是否录制视频 True/False\nrecord = False\n\n[suites]\n;填写用例的关键字\ncases = test.air\n```\n\n- app启动命令\n1. 普通启动\n```shell\npython run.py\n```\n2. 参数化启动\n```shell\n# Android\npython run.py --platform=Android --device=127.0.0.1:5555 --init=True\n# iOS\npython run.py --platform=iOS --wda=com.facebook.WebDriverAgentRunner.utx.xctrunner --init=True\n```\n\u003e参数优先级大于配置文件\n\u003e \u003e多个设备以,分割; 例如 python run.py --platform=Android --device=设备1,设备2,设备3 --init=True\n\n## web使用说明\n\n- 无需关注 chrome浏览器驱动\n\u003e 注意:无需配置 chromedriver ,系统会自动化维护匹配版本。\n- 只需在配置文件中填好相关内容,即可运行!\n```ini\n[web_info]\n;被测的主页url\nurl = https://www.baidu.com/\n;是否无界面运行\nheadless = False\n\n[reruns]\n;失败后再次运行次数,默认1次\ntimes = 1\n\n[paths]\n;自定义执行case目录层级,文件夹名称(例如:smoke),默认为空\nname = \n\n[mode]\n;False 表示 运行[suites][cases]选择的用例,True表示运行全部用例\nis_all = True\n\n[suites]\n;填写用例的关键字\ncases = chrome\n\n```\n\n- web启动命令\n1. 普通启动\n```shell\npython run.py\n```\n2. 参数化启动\n```shell\npython run.py --headless=True --driver=/Users/admin/driverpath\n```\n\u003e参数优先级大于配置文件\n\n## 运行结果\n- 报告展示\n\n\n![image.png](/static/img/bc6387d7b9f720991dd9e0aa5a007ae7.image.webp)\n\n","tags":["开源项目"],"top":0,"category":"开源项目","hidden":false,"author":"李佳玮","pathname":"","private":false,"viewer":289,"visited":289,"createdAt":"2023-11-02T11:02:14.520Z","updatedAt":"2023-11-02T11:04:48.727Z","id":24,"lastVisitedTime":"2026-09-27T03:11:21.124Z"},"pre":{"title":"给我的公众号添加了一个AI机器人~","id":23,"pathname":""},"next":{"title":"如何在Python包中控制只允许特定Python版本使用","id":25,"pathname":""},"pay":["https://openutx.cn/static/img/22dce95a52ba05dfde3eaf8e6834fafe.IMG_7229.webp","https://openutx.cn/static/img/cb6ed61087eb2918e9f3ed8ac36e1262.IMG_7228.webp"],"payDark":["",""],"author":"李佳玮","showSubMenu":"true"},"__N_SSG":true},"page":"/post/[id]","query":{"id":"24"},"buildId":"77JJh7CBRvlkoRHH7B3Ea","isFallback":false,"dynamicIds":[9272],"gsp":true,"scriptLoader":[]}</script>
227<script type="module" src="https://static.cloudflareinsights.com/beacon.min.js/v31edd6df95cf4e85bb4c19e7a9bdbcba1788362987495" integrity="sha512-iIg7k2xntmwu6/uSb5tpc/hySgZc4eoL31yB29W6tJFo2akwjPWcEqnCEdJvGexCL0KEQwVYv5BlowfhVz26hg==" data-cf-beacon='{"version":"2024.11.0","token":"c72bee5a3a3b45f6b358f07a2f08deed","r":1,"spa":2}' crossorigin="anonymous"></script>
227
228</body></html>

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.