<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Cloudpods –
测试</title><link>/docs/zh/tags/%E6%B5%8B%E8%AF%95/</link><description>Recent content in 测试 on Cloudpods</description><generator>Hugo -- gohugo.io</generator><language>zh-CN</language><atom:link href="/docs/zh/tags/%E6%B5%8B%E8%AF%95/index.xml" rel="self" type="application/rss+xml"/><item><title>Docs: 登录测试用例</title><link>/docs/zh/docs/web_ui/testcase/login/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/docs/zh/docs/web_ui/testcase/login/</guid><description>
&lt;h2 id="适用范围"&gt;适用范围&lt;/h2&gt;
&lt;p&gt;覆盖云联壹云 Web 控制台的登录、登录安全策略、退出与会话管理。涉及的产品功能参见：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="../../../practice/login"&gt;登录界面&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="../../intro/usercenter/userinfor"&gt;用户信息&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="../../intro/usercenter/signout"&gt;退出系统&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="../../intro/ui/view"&gt;切换视图&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="../../auth-security/authentication/authentication-system/systemuser"&gt;用户管理&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="../../auth-security/security/security-alert/securityalert"&gt;安全告警&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="环境与账号"&gt;环境与账号&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;项目&lt;/th&gt;
&lt;th&gt;值&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;地址&lt;/td&gt;
&lt;td&gt;&lt;a href="https://test.yunion.io" target="_blank" rel="noopener noreferrer"&gt;https://test.yunion.io&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;账号&lt;/td&gt;
&lt;td&gt;cloudadmin&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;密码&lt;/td&gt;
&lt;td&gt;cloudadmin@test&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;域&lt;/td&gt;
&lt;td&gt;Default&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;登录页元素（以实际界面为准）：账号登录/手机号登录页签、用户名输入框、密码输入框、登录按钮、图形验证码（按策略出现）、指定登录域入口、忘记密码、第三方/CAS 登录入口。&lt;/p&gt;
&lt;h2 id="用例总览"&gt;用例总览&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;编号&lt;/th&gt;
&lt;th&gt;用例名称&lt;/th&gt;
&lt;th&gt;优先级&lt;/th&gt;
&lt;th&gt;类型&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;TC-LOGIN-001&lt;/td&gt;
&lt;td&gt;使用正确的用户名和密码登录&lt;/td&gt;
&lt;td&gt;P0&lt;/td&gt;
&lt;td&gt;正向&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TC-LOGIN-002&lt;/td&gt;
&lt;td&gt;使用错误的密码登录&lt;/td&gt;
&lt;td&gt;P0&lt;/td&gt;
&lt;td&gt;反向&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TC-LOGIN-003&lt;/td&gt;
&lt;td&gt;使用不存在的用户名登录&lt;/td&gt;
&lt;td&gt;P1&lt;/td&gt;
&lt;td&gt;反向&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TC-LOGIN-004&lt;/td&gt;
&lt;td&gt;用户名或密码为空提交&lt;/td&gt;
&lt;td&gt;P1&lt;/td&gt;
&lt;td&gt;校验&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TC-LOGIN-005&lt;/td&gt;
&lt;td&gt;指定登录域登录&lt;/td&gt;
&lt;td&gt;P1&lt;/td&gt;
&lt;td&gt;正向&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TC-LOGIN-006&lt;/td&gt;
&lt;td&gt;域与用户不匹配时登录失败&lt;/td&gt;
&lt;td&gt;P2&lt;/td&gt;
&lt;td&gt;反向&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TC-LOGIN-007&lt;/td&gt;
&lt;td&gt;连续输错密码后出现图形验证码&lt;/td&gt;
&lt;td&gt;P1&lt;/td&gt;
&lt;td&gt;安全&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TC-LOGIN-008&lt;/td&gt;
&lt;td&gt;连续输错密码超过上限锁定账户并产生安全告警&lt;/td&gt;
&lt;td&gt;P1&lt;/td&gt;
&lt;td&gt;安全&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TC-LOGIN-009&lt;/td&gt;
&lt;td&gt;禁用&amp;quot;控制台登录&amp;quot;的用户无法登录&lt;/td&gt;
&lt;td&gt;P1&lt;/td&gt;
&lt;td&gt;反向&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TC-LOGIN-010&lt;/td&gt;
&lt;td&gt;被禁用的用户无法登录&lt;/td&gt;
&lt;td&gt;P1&lt;/td&gt;
&lt;td&gt;反向&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TC-LOGIN-011&lt;/td&gt;
&lt;td&gt;启用 MFA 的用户登录&lt;/td&gt;
&lt;td&gt;P1&lt;/td&gt;
&lt;td&gt;正向&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TC-LOGIN-012&lt;/td&gt;
&lt;td&gt;密码已过期的用户无法登录&lt;/td&gt;
&lt;td&gt;P2&lt;/td&gt;
&lt;td&gt;反向&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TC-LOGIN-013&lt;/td&gt;
&lt;td&gt;登录后落地视图正确&lt;/td&gt;
&lt;td&gt;P0&lt;/td&gt;
&lt;td&gt;正向&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TC-LOGIN-014&lt;/td&gt;
&lt;td&gt;退出登录后会话失效&lt;/td&gt;
&lt;td&gt;P0&lt;/td&gt;
&lt;td&gt;正向&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TC-LOGIN-015&lt;/td&gt;
&lt;td&gt;未登录直接访问内页跳转登录页&lt;/td&gt;
&lt;td&gt;P1&lt;/td&gt;
&lt;td&gt;安全&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TC-LOGIN-016&lt;/td&gt;
&lt;td&gt;切换登录界面语言&lt;/td&gt;
&lt;td&gt;P2&lt;/td&gt;
&lt;td&gt;正向&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TC-LOGIN-017&lt;/td&gt;
&lt;td&gt;认证源（LDAP）用户登录&lt;/td&gt;
&lt;td&gt;P2&lt;/td&gt;
&lt;td&gt;正向&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TC-LOGIN-018&lt;/td&gt;
&lt;td&gt;登录会话有效期&lt;/td&gt;
&lt;td&gt;P2&lt;/td&gt;
&lt;td&gt;安全&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="tc-login-001-使用正确的用户名和密码登录"&gt;TC-LOGIN-001 使用正确的用户名和密码登录&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;优先级&lt;/strong&gt;：P0&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;前置条件&lt;/strong&gt;：cloudadmin 账号已启用且允许控制台登录。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;步骤&lt;/strong&gt;：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;浏览器打开 &lt;a href="https://test.yunion.io" target="_blank" rel="noopener noreferrer"&gt;https://test.yunion.io&lt;/a&gt; 。&lt;/li&gt;
&lt;li&gt;在&amp;quot;账号登录&amp;quot;页签中输入用户名 &lt;code&gt;cloudadmin&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;输入密码 &lt;code&gt;cloudadmin@test&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;单击&amp;quot;登录&amp;quot;按钮。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;预期结果&lt;/strong&gt;：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;提交后界面提示&amp;quot;正在登录，请稍候&amp;quot;一类的过渡状态。&lt;/li&gt;
&lt;li&gt;登录成功，跳转到控制面板页面，右上角显示当前用户。&lt;/li&gt;
&lt;li&gt;顶部区域显示视图切换入口，当前视图为&lt;strong&gt;管理后台视图&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;浏览器中生成登录凭证（&lt;code&gt;yunionauth&lt;/code&gt;）及 &lt;code&gt;scope&lt;/code&gt;、&lt;code&gt;domain&lt;/code&gt;、&lt;code&gt;tenant&lt;/code&gt; 等 Cookie。&lt;/li&gt;
&lt;li&gt;再次输入地址访问控制台，无需重新登录。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;实测结果&lt;/strong&gt;：通过（接口层已验证，见附录 B）。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="tc-login-002-使用错误的密码登录"&gt;TC-LOGIN-002 使用错误的密码登录&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;优先级&lt;/strong&gt;：P0&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;前置条件&lt;/strong&gt;：同 TC-LOGIN-001。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;步骤&lt;/strong&gt;：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;打开登录页。&lt;/li&gt;
&lt;li&gt;输入用户名 &lt;code&gt;cloudadmin&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;输入错误密码 &lt;code&gt;wrongpass123&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;单击&amp;quot;登录&amp;quot;按钮。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;预期结果&lt;/strong&gt;：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;登录失败，停留在登录页。&lt;/li&gt;
&lt;li&gt;页面提示&amp;quot;用户名或密码错误&amp;quot;（接口返回 &lt;code&gt;incorrect username or password&lt;/code&gt;）。&lt;/li&gt;
&lt;li&gt;密码输入框被清空或以密文形式保留，不出现明文回显。&lt;/li&gt;
&lt;li&gt;未生成有效登录凭证，无法进入控制台。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;实测结果&lt;/strong&gt;：通过。接口返回 HTTP 401，响应体为 &lt;code&gt;{&amp;quot;class&amp;quot;:&amp;quot;IncorrectUsernameOrPassword&amp;quot;,&amp;quot;code&amp;quot;:401,&amp;quot;details&amp;quot;:&amp;quot;incorrect username or password&amp;quot;}&lt;/code&gt;。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="tc-login-003-使用不存在的用户名登录"&gt;TC-LOGIN-003 使用不存在的用户名登录&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;优先级&lt;/strong&gt;：P1&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;步骤&lt;/strong&gt;：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;打开登录页。&lt;/li&gt;
&lt;li&gt;输入用户名 &lt;code&gt;no_such_user_9999&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;输入任意密码。&lt;/li&gt;
&lt;li&gt;单击&amp;quot;登录&amp;quot;按钮。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;预期结果&lt;/strong&gt;：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;登录失败。&lt;/li&gt;
&lt;li&gt;提示信息与 TC-LOGIN-002 &lt;strong&gt;一致&lt;/strong&gt;，不区分&amp;quot;用户名不存在&amp;quot;与&amp;quot;密码错误&amp;quot;，避免泄露账号是否存在。&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2 id="tc-login-004-用户名或密码为空提交"&gt;TC-LOGIN-004 用户名或密码为空提交&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;优先级&lt;/strong&gt;：P1&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;步骤&lt;/strong&gt;：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;打开登录页，用户名与密码均留空，单击&amp;quot;登录&amp;quot;按钮。&lt;/li&gt;
&lt;li&gt;仅填写用户名，密码留空，单击&amp;quot;登录&amp;quot;按钮。&lt;/li&gt;
&lt;li&gt;仅填写密码，用户名留空，单击&amp;quot;登录&amp;quot;按钮。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;预期结果&lt;/strong&gt;：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;三种情况均不发起登录请求，直接停留在当前页。&lt;/li&gt;
&lt;li&gt;对应的输入框下方出现校验提示&amp;quot;请输入用户名&amp;quot;/&amp;ldquo;请输入密码&amp;rdquo;。&lt;/li&gt;
&lt;li&gt;输入框标红或有明显错误态。&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2 id="tc-login-005-指定登录域登录"&gt;TC-LOGIN-005 指定登录域登录&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;优先级&lt;/strong&gt;：P1&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;前置条件&lt;/strong&gt;：Default 域存在已启用且允许控制台登录的用户。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;步骤&lt;/strong&gt;：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;打开登录页，单击&amp;quot;指定登录域&amp;quot;入口。&lt;/li&gt;
&lt;li&gt;在域列表中选择 &lt;code&gt;Default&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;输入用户名 &lt;code&gt;cloudadmin&lt;/code&gt;、密码 &lt;code&gt;cloudadmin@test&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;单击&amp;quot;登录&amp;quot;按钮。&lt;/li&gt;
&lt;li&gt;在控制台右上角用户菜单中重新打开登录域设置，单击&amp;quot;重置登录域&amp;quot;。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;预期结果&lt;/strong&gt;：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;指定登录域后界面显示&amp;quot;当前登录域：Default&amp;quot;。&lt;/li&gt;
&lt;li&gt;登录成功，进入控制台。&lt;/li&gt;
&lt;li&gt;重置登录域后，登录页恢复为平台级登录，不预选任何域。&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2 id="tc-login-006-域与用户不匹配时登录失败"&gt;TC-LOGIN-006 域与用户不匹配时登录失败&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;优先级&lt;/strong&gt;：P2&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;前置条件&lt;/strong&gt;：存在一个 cloudadmin 未加入的域（如新建域 &lt;code&gt;testdomain&lt;/code&gt;）。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;步骤&lt;/strong&gt;：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;打开登录页，单击&amp;quot;指定登录域&amp;quot;，选择 cloudadmin 未加入的域。&lt;/li&gt;
&lt;li&gt;输入用户名 &lt;code&gt;cloudadmin&lt;/code&gt;、密码 &lt;code&gt;cloudadmin@test&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;单击&amp;quot;登录&amp;quot;按钮。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;预期结果&lt;/strong&gt;：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;登录失败，提示用户名或密码错误。&lt;/li&gt;
&lt;li&gt;不发生跨域越权登录。&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2 id="tc-login-007-连续输错密码后出现图形验证码"&gt;TC-LOGIN-007 连续输错密码后出现图形验证码&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;优先级&lt;/strong&gt;：P1&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;前置条件&lt;/strong&gt;：确认平台已配置密码错误次数阈值（keystone 服务参数 &lt;code&gt;password_error_lock_count&lt;/code&gt;，默认 0 表示不锁定）。&lt;strong&gt;该用例会占用 cloudadmin 的错误次数，执行前请与管理员确认阈值，避免锁定账号。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;步骤&lt;/strong&gt;：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;使用 cloudadmin 与错误密码连续登录，直到界面出现验证码输入框。&lt;/li&gt;
&lt;li&gt;记录触发验证码所需的失败次数。&lt;/li&gt;
&lt;li&gt;在验证码输入框中输入错误验证码，单击&amp;quot;登录&amp;quot;。&lt;/li&gt;
&lt;li&gt;输入正确验证码后提交。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;预期结果&lt;/strong&gt;：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;达到阈值后登录页出现图形验证码输入框，且验证码图片可刷新。&lt;/li&gt;
&lt;li&gt;验证码错误时提示&amp;quot;请输入有效的验证码&amp;quot;/&amp;ldquo;验证码错误&amp;rdquo;，登录被拒绝。&lt;/li&gt;
&lt;li&gt;验证码正确且密码正确时登录成功。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;备注&lt;/strong&gt;：若平台未开启验证码策略，本用例标记为&amp;quot;不适用&amp;quot;并记录平台配置值。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="tc-login-008-连续输错密码超过上限锁定账户并产生安全告警"&gt;TC-LOGIN-008 连续输错密码超过上限锁定账户并产生安全告警&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;优先级&lt;/strong&gt;：P1&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;前置条件&lt;/strong&gt;：&lt;code&gt;password_error_lock_count&lt;/code&gt; 已配置为大于 0 的值。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;步骤&lt;/strong&gt;：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;使用 cloudadmin 与错误密码连续登录，超过配置的阈值。&lt;/li&gt;
&lt;li&gt;尝试使用&lt;strong&gt;正确&lt;/strong&gt;密码登录。&lt;/li&gt;
&lt;li&gt;使用管理员账号登录，查看安全告警列表。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;预期结果&lt;/strong&gt;：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;超过阈值后账户被锁定，即使输入正确密码也无法登录，提示账户已锁定。&lt;/li&gt;
&lt;li&gt;安全告警页面生成一条&amp;quot;异常登录&amp;quot;告警记录。&lt;/li&gt;
&lt;li&gt;告警同时发送给被锁定用户本人、其所在域的域管理员和系统管理员。&lt;/li&gt;
&lt;li&gt;解除锁定后，使用正确密码可正常登录。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;备注&lt;/strong&gt;：&lt;strong&gt;该用例会锁定 cloudadmin 账号&lt;/strong&gt;，请勿在生产或共享环境执行；执行前确认可解锁。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="tc-login-009-禁用控制台登录的用户无法登录"&gt;TC-LOGIN-009 禁用&amp;quot;控制台登录&amp;quot;的用户无法登录&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;优先级&lt;/strong&gt;：P1&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;前置条件&lt;/strong&gt;：准备一个已启用但**关闭&amp;quot;登录控制台&amp;quot;**的本地用户。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;步骤&lt;/strong&gt;：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;使用管理员在用户管理中新建用户，关闭&amp;quot;登录控制台&amp;quot;。&lt;/li&gt;
&lt;li&gt;退出当前登录，使用该用户登录控制台。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;预期结果&lt;/strong&gt;：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;登录被拒绝，提示无控制台登录权限或用户名密码错误。&lt;/li&gt;
&lt;li&gt;该用户仍可通过 API 等方式访问（如平台允许），但无法登录控制台。&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2 id="tc-login-010-被禁用的用户无法登录"&gt;TC-LOGIN-010 被禁用的用户无法登录&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;优先级&lt;/strong&gt;：P1&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;前置条件&lt;/strong&gt;：准备一个处于禁用状态的用户，且该用户当前已在线。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;步骤&lt;/strong&gt;：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;使用该用户登录控制台并保持在线。&lt;/li&gt;
&lt;li&gt;使用管理员在用户管理中禁用该用户。&lt;/li&gt;
&lt;li&gt;该用户继续操作控制台页面。&lt;/li&gt;
&lt;li&gt;该用户退出后再次登录。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;预期结果&lt;/strong&gt;：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;禁用操作&lt;strong&gt;不会&lt;/strong&gt;强制在线用户立即退出。&lt;/li&gt;
&lt;li&gt;用户退出后再次登录失败，提示用户已禁用。&lt;/li&gt;
&lt;li&gt;使用被禁用用户的正确密码登录同样失败。&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2 id="tc-login-011-启用-mfa-的用户登录"&gt;TC-LOGIN-011 启用 MFA 的用户登录&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;优先级&lt;/strong&gt;：P1&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;前置条件&lt;/strong&gt;：全局配置已启用双因子认证，且目标用户已开启 MFA 并完成凭证绑定。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;步骤&lt;/strong&gt;：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;使用已开启 MFA 的用户登录，输入正确的用户名和密码。&lt;/li&gt;
&lt;li&gt;在出现的登录保护页面中输入 6 位安全码。&lt;/li&gt;
&lt;li&gt;使用错误安全码提交一次。&lt;/li&gt;
&lt;li&gt;使用正确安全码提交。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;预期结果&lt;/strong&gt;：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;密码校验通过后不直接进入控制台，而是要求输入 6 位安全码。&lt;/li&gt;
&lt;li&gt;错误安全码提示&amp;quot;安全码不正确，请重新输入&amp;quot;，无法进入控制台。&lt;/li&gt;
&lt;li&gt;正确安全码提交后成功进入控制台。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;备注&lt;/strong&gt;：test.yunion.io 上 cloudadmin 当前&lt;strong&gt;未开启&lt;/strong&gt; MFA（登录凭证中 &lt;code&gt;totp_on=false&lt;/code&gt;），执行本用例需先准备一个开启 MFA 的用户；若全局双因子认证未启用，用户侧 MFA 开关不生效。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="tc-login-012-密码已过期的用户无法登录"&gt;TC-LOGIN-012 密码已过期的用户无法登录&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;优先级&lt;/strong&gt;：P2&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;前置条件&lt;/strong&gt;：存在密码已过期的用户。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;步骤&lt;/strong&gt;：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;使用密码已过期的用户登录。&lt;/li&gt;
&lt;li&gt;使用密码还有 7 天过期的用户登录。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;预期结果&lt;/strong&gt;：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;密码已过期的用户&lt;strong&gt;无法&lt;/strong&gt;登录系统。&lt;/li&gt;
&lt;li&gt;密码还有 7 天过期的用户可正常登录，登录后提示密码即将过期，建议尽快修改。&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2 id="tc-login-013-登录后落地视图正确"&gt;TC-LOGIN-013 登录后落地视图正确&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;优先级&lt;/strong&gt;：P0&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;前置条件&lt;/strong&gt;：cloudadmin 为 Default 域 system 项目的 admin 角色。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;步骤&lt;/strong&gt;：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;使用 cloudadmin 登录。&lt;/li&gt;
&lt;li&gt;查看顶部区域视图切换入口。&lt;/li&gt;
&lt;li&gt;依次切换到域管理后台视图、项目视图，再切回管理后台视图。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;预期结果&lt;/strong&gt;：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;默认落地&lt;strong&gt;管理后台视图&lt;/strong&gt;，可看到系统级资源。&lt;/li&gt;
&lt;li&gt;视图切换入口正常展示，切换后左侧导航菜单随视图变化。&lt;/li&gt;
&lt;li&gt;域管理后台视图要求平台已开启三级权限；未开启时该视图不出现。&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2 id="tc-login-014-退出登录后会话失效"&gt;TC-LOGIN-014 退出登录后会话失效&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;优先级&lt;/strong&gt;：P0&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;步骤&lt;/strong&gt;：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;登录控制台，记录当前地址。&lt;/li&gt;
&lt;li&gt;单击右上角用户图标，选择&amp;quot;退出&amp;quot;。&lt;/li&gt;
&lt;li&gt;使用浏览器后退按钮回到退出前的页面。&lt;/li&gt;
&lt;li&gt;直接粘贴退出前的内页地址访问。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;预期结果&lt;/strong&gt;：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;退出后跳转到登录页。&lt;/li&gt;
&lt;li&gt;后退或直接访问内页均被重定向到登录页，不展示业务数据。&lt;/li&gt;
&lt;li&gt;浏览器中的登录凭证已失效。&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;第三方认证源（如 CAS）用户退出后，若认证服务器侧会话未销毁，可能被自动重新登录，属于认证源行为，需单独确认。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id="tc-login-015-未登录直接访问内页跳转登录页"&gt;TC-LOGIN-015 未登录直接访问内页跳转登录页&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;优先级&lt;/strong&gt;：P1&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;步骤&lt;/strong&gt;：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;清除浏览器 Cookie 或使用无痕窗口。&lt;/li&gt;
&lt;li&gt;直接访问内页地址，如 &lt;code&gt;/vminstance&lt;/code&gt; 一类的资源列表地址。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;预期结果&lt;/strong&gt;：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;请求被拦截，跳转到登录页。&lt;/li&gt;
&lt;li&gt;登录成功后跳转回原访问的内页地址（如平台支持回跳）。&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2 id="tc-login-016-切换登录界面语言"&gt;TC-LOGIN-016 切换登录界面语言&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;优先级&lt;/strong&gt;：P2&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;步骤&lt;/strong&gt;：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;打开登录页，将界面语言切换为英文。&lt;/li&gt;
&lt;li&gt;切换回简体中文。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;预期结果&lt;/strong&gt;：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;登录页文案随语言切换，登录按钮、输入框提示、错误提示均为目标语言。&lt;/li&gt;
&lt;li&gt;切换语言不影响已输入的用户名和密码。&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2 id="tc-login-017-认证源ldap用户登录"&gt;TC-LOGIN-017 认证源（LDAP）用户登录&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;优先级&lt;/strong&gt;：P2&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;前置条件&lt;/strong&gt;：平台已配置并启用 LDAP 认证源，且已同步用户。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;步骤&lt;/strong&gt;：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;在登录页选择对应的认证源（如&amp;quot;指定登录域&amp;quot;中选择认证源对应的域）。&lt;/li&gt;
&lt;li&gt;输入 LDAP 用户的用户名和密码登录。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;预期结果&lt;/strong&gt;：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;认证源用户可正常登录控制台。&lt;/li&gt;
&lt;li&gt;用户管理中被标记为 LDAP 认证源的用户，&lt;strong&gt;不支持&lt;/strong&gt;在平台侧重置密码。&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2 id="tc-login-018-登录会话有效期"&gt;TC-LOGIN-018 登录会话有效期&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;优先级&lt;/strong&gt;：P2&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;步骤&lt;/strong&gt;：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;登录控制台，查看登录凭证 Cookie 的过期时间。&lt;/li&gt;
&lt;li&gt;保持页面空闲超过凭证有效期后，再操作页面或访问内页。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;预期结果&lt;/strong&gt;：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;登录凭证有效期默认为 24 小时（&lt;code&gt;Max-Age=86399&lt;/code&gt;）。&lt;/li&gt;
&lt;li&gt;凭证过期后，操作页面或访问内页被重定向到登录页，需重新登录。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;实测结果&lt;/strong&gt;：通过。实测登录响应中 &lt;code&gt;yunionauth&lt;/code&gt;、&lt;code&gt;scope&lt;/code&gt;、&lt;code&gt;domain&lt;/code&gt;、&lt;code&gt;tenant&lt;/code&gt; 四个 Cookie 的 &lt;code&gt;Max-Age&lt;/code&gt; 均为 86399 秒。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="附录-a接口层验证脚本"&gt;附录 A：接口层验证脚本&lt;/h2&gt;
&lt;p&gt;登录相关的界面行为可用登录接口快速回归。以下脚本对 &lt;a href="https://test.yunion.io" target="_blank" rel="noopener noreferrer"&gt;https://test.yunion.io&lt;/a&gt; 执行接口级验证，可直接复制运行（需要 &lt;code&gt;curl&lt;/code&gt; 与 &lt;code&gt;python3&lt;/code&gt;）。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#!/bin/bash
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# verify_login.sh — 登录接口回归验证&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;BASE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;https://test.yunion.io&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;USER&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;cloudadmin&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;PASS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;cloudadmin@test&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;DOMAIN&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Default&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;== TC-LOGIN-001 正确凭据登录 ==&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;code&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;curl -s -o /tmp/login_ok.txt -w &lt;span class="s2"&gt;&amp;#34;%{http_code}&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -c /tmp/login_cookie.txt &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -X POST -H &lt;span class="s1"&gt;&amp;#39;Content-Type: application/json&amp;#39;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -d &lt;span class="s2"&gt;&amp;#34;{\&amp;#34;username\&amp;#34;:\&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$USER&lt;/span&gt;&lt;span class="s2"&gt;\&amp;#34;,\&amp;#34;password\&amp;#34;:\&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$PASS&lt;/span&gt;&lt;span class="s2"&gt;\&amp;#34;,\&amp;#34;domain\&amp;#34;:\&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$DOMAIN&lt;/span&gt;&lt;span class="s2"&gt;\&amp;#34;}&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$BASE&lt;/span&gt;&lt;span class="s2"&gt;/api/v1/auth/login&amp;#34;&lt;/span&gt;&lt;span class="k"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;HTTP &lt;/span&gt;&lt;span class="nv"&gt;$code&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$code&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;200&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;PASS: 登录成功&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; grep -q yunionauth /tmp/login_cookie.txt &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;PASS: 已下发 yunionauth 凭证&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;FAIL: 预期 200，实际 &lt;/span&gt;&lt;span class="nv"&gt;$code&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;== TC-LOGIN-002 错误密码登录 ==&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;resp&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;curl -s -w &lt;span class="s2"&gt;&amp;#34;\n%{http_code}&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -X POST -H &lt;span class="s1"&gt;&amp;#39;Content-Type: application/json&amp;#39;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -d &lt;span class="s2"&gt;&amp;#34;{\&amp;#34;username\&amp;#34;:\&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$USER&lt;/span&gt;&lt;span class="s2"&gt;\&amp;#34;,\&amp;#34;password\&amp;#34;:\&amp;#34;wrongpass123\&amp;#34;,\&amp;#34;domain\&amp;#34;:\&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$DOMAIN&lt;/span&gt;&lt;span class="s2"&gt;\&amp;#34;}&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$BASE&lt;/span&gt;&lt;span class="s2"&gt;/api/v1/auth/login&amp;#34;&lt;/span&gt;&lt;span class="k"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;body&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$resp&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; head -n -1&lt;span class="k"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;code&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$resp&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; tail -n 1&lt;span class="k"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;HTTP &lt;/span&gt;&lt;span class="nv"&gt;$code&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$body&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; grep -q IncorrectUsernameOrPassword &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;PASS: 返回 IncorrectUsernameOrPassword&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;FAIL: 未返回预期错误类型&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;== TC-LOGIN-003 不存在用户登录（提示应与错误密码一致） ==&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;resp&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;curl -s -w &lt;span class="s2"&gt;&amp;#34;\n%{http_code}&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -X POST -H &lt;span class="s1"&gt;&amp;#39;Content-Type: application/json&amp;#39;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -d &lt;span class="s2"&gt;&amp;#34;{\&amp;#34;username\&amp;#34;:\&amp;#34;no_such_user_9999\&amp;#34;,\&amp;#34;password\&amp;#34;:\&amp;#34;whatever\&amp;#34;,\&amp;#34;domain\&amp;#34;:\&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$DOMAIN&lt;/span&gt;&lt;span class="s2"&gt;\&amp;#34;}&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$BASE&lt;/span&gt;&lt;span class="s2"&gt;/api/v1/auth/login&amp;#34;&lt;/span&gt;&lt;span class="k"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;body&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$resp&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; head -n -1&lt;span class="k"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;code&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$resp&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; tail -n 1&lt;span class="k"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;HTTP &lt;/span&gt;&lt;span class="nv"&gt;$code&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$body&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; grep -q IncorrectUsernameOrPassword &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;PASS: 与错误密码返回一致，未泄露账号是否存在&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;FAIL: 错误类型与错误密码不一致&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;== TC-LOGIN-018 会话有效期 ==&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;exp&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;curl -s -D - -o /dev/null &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -X POST -H &lt;span class="s1"&gt;&amp;#39;Content-Type: application/json&amp;#39;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -d &lt;span class="s2"&gt;&amp;#34;{\&amp;#34;username\&amp;#34;:\&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$USER&lt;/span&gt;&lt;span class="s2"&gt;\&amp;#34;,\&amp;#34;password\&amp;#34;:\&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$PASS&lt;/span&gt;&lt;span class="s2"&gt;\&amp;#34;,\&amp;#34;domain\&amp;#34;:\&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$DOMAIN&lt;/span&gt;&lt;span class="s2"&gt;\&amp;#34;}&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$BASE&lt;/span&gt;&lt;span class="s2"&gt;/api/v1/auth/login&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; grep -i &lt;span class="s1"&gt;&amp;#39;^set-cookie: yunionauth&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; grep -o &lt;span class="s1"&gt;&amp;#39;Max-Age=[0-9]*&amp;#39;&lt;/span&gt;&lt;span class="k"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;yunionauth &lt;/span&gt;&lt;span class="nv"&gt;$exp&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$exp&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Max-Age=86399&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;PASS: 有效期为 24 小时&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;WARN: 有效期与预期 86399 不同&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;登录成功后可用 &lt;code&gt;/tmp/login_cookie.txt&lt;/code&gt; 中的凭证调用其他业务接口，例如：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;curl -s -b /tmp/login_cookie.txt &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$BASE&lt;/span&gt;&lt;span class="s2"&gt;/api/v1/servers?limit=5&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="附录-b本环境实测记录"&gt;附录 B：本环境实测记录&lt;/h2&gt;
&lt;p&gt;以下接口行为在 &lt;a href="https://test.yunion.io" target="_blank" rel="noopener noreferrer"&gt;https://test.yunion.io&lt;/a&gt; 实测确认（2026-09-15），可作为用例预期结果的基准。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;检查项&lt;/th&gt;
&lt;th&gt;实测结果&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;控制台可达性&lt;/td&gt;
&lt;td&gt;HTTP 200，HTTP/2，nginx&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;登录接口&lt;/td&gt;
&lt;td&gt;&lt;code&gt;POST /api/v1/auth/login&lt;/code&gt;，请求体 &lt;code&gt;{&amp;quot;username&amp;quot;,&amp;quot;password&amp;quot;,&amp;quot;domain&amp;quot;}&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;正确凭据&lt;/td&gt;
&lt;td&gt;HTTP 200，响应体为空，下发 &lt;code&gt;yunionauth&lt;/code&gt;/&lt;code&gt;scope&lt;/code&gt;/&lt;code&gt;domain&lt;/code&gt;/&lt;code&gt;tenant&lt;/code&gt; Cookie&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;错误密码&lt;/td&gt;
&lt;td&gt;HTTP 401，&lt;code&gt;{&amp;quot;class&amp;quot;:&amp;quot;IncorrectUsernameOrPassword&amp;quot;,&amp;quot;details&amp;quot;:&amp;quot;incorrect username or password&amp;quot;}&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;cloudadmin 默认 scope&lt;/td&gt;
&lt;td&gt;&lt;code&gt;system&lt;/code&gt;（管理后台视图）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;cloudadmin 默认域&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Default&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;cloudadmin MFA 状态&lt;/td&gt;
&lt;td&gt;未开启（凭证中 &lt;code&gt;totp_on=false&lt;/code&gt;、&lt;code&gt;totp_verified=false&lt;/code&gt;）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;登录凭证有效期&lt;/td&gt;
&lt;td&gt;86399 秒（24 小时）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;图形验证码接口&lt;/td&gt;
&lt;td&gt;&lt;code&gt;GET /api/v1/auth/captcha&lt;/code&gt;，返回 &lt;code&gt;image/png&lt;/code&gt; 并下发 &lt;code&gt;captcha&lt;/code&gt; Cookie&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;说明&lt;/strong&gt;：以上为接口层实测结论；依赖界面交互的用例（如验证码出现时机、MFA 交互、密码过期提示）仍需按用例步骤在浏览器中执行确认。&lt;/p&gt;</description></item><item><title>Docs: 创建虚拟机测试用例</title><link>/docs/zh/docs/web_ui/testcase/vminstance-create/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/docs/zh/docs/web_ui/testcase/vminstance-create/</guid><description>
&lt;h2 id="适用范围"&gt;适用范围&lt;/h2&gt;
&lt;p&gt;覆盖新建虚拟机的各项参数配置与创建结果验证。参数含义参见&lt;a href="../../resource-mgmt/compute/server/vminstance/create"&gt;新建虚拟机&lt;/a&gt;，创建后的操作参见&lt;a href="../../resource-mgmt/compute/server/vminstance/lifecycle"&gt;实例操作&lt;/a&gt;与&lt;a href="../../resource-mgmt/compute/server/vminstance/detail"&gt;详情查看&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;操作入口&lt;/strong&gt;（参见手册&amp;quot;操作入口&amp;quot;一节）：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;创建本地IDC虚拟机：虚拟机页面单击列表上方&amp;quot;新建&amp;quot;按钮；&lt;/li&gt;
&lt;li&gt;创建私有云虚拟机：单击顶部&amp;quot;私有云&amp;quot;页签，再单击&amp;quot;新建&amp;quot;按钮；&lt;/li&gt;
&lt;li&gt;创建公有云虚拟机：单击顶部&amp;quot;公有云&amp;quot;页签，再单击&amp;quot;新建&amp;quot;按钮。&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;在任意新建虚拟机页面，都可通过顶部&amp;quot;本地IDC&amp;quot;、&amp;ldquo;私有云&amp;rdquo;、&amp;ldquo;公有云&amp;quot;页签切换要创建的平台。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="环境核查"&gt;环境核查&lt;/h2&gt;
&lt;p&gt;执行用例前请先核查本节各项，任一项不满足将导致对应用例无法通过（此时应记为&amp;quot;阻塞&amp;quot;而非&amp;quot;失败&amp;rdquo;）。&lt;/p&gt;
&lt;h3 id="本地idc"&gt;本地IDC&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;基础资源中存在&lt;strong&gt;启用&lt;/strong&gt;且&lt;strong&gt;在线&lt;/strong&gt;状态的云联壹云平台宿主机，或云管平台已对接 VMware 平台且存在启用状态的 VMware 宿主机；&lt;/li&gt;
&lt;li&gt;目标可用区存在属性为&amp;quot;guest&amp;quot;的可用 IP 子网；&lt;/li&gt;
&lt;li&gt;系统镜像列表中存在状态为&amp;quot;可用&amp;quot;的公共镜像或自定义镜像。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="私有云"&gt;私有云&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;云管平台已导入 OpenStack、ZStack、泽塔云或 HCSO 云账号的资源；&lt;/li&gt;
&lt;li&gt;基础资源中存在启用状态、属于上述平台的宿主机；&lt;/li&gt;
&lt;li&gt;对应平台有可用的 IP 子网。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="公有云"&gt;公有云&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;云管平台已导入阿里云、AWS、Azure、华为云、腾讯云或 UCloud 云账号；&lt;/li&gt;
&lt;li&gt;云账号已启用且状态正常、余额充足；&lt;/li&gt;
&lt;li&gt;对应平台区域存在 VPC 和 IP 子网。&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;核查结果可参考本文档&amp;quot;附录 A：本环境资源实测快照&amp;quot;中的实测数据。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="用例总览"&gt;用例总览&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;编号&lt;/th&gt;
&lt;th&gt;用例名称&lt;/th&gt;
&lt;th&gt;优先级&lt;/th&gt;
&lt;th&gt;平台&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;TC-VM-001&lt;/td&gt;
&lt;td&gt;本地IDC创建Linux虚拟机（最小必填参数）&lt;/td&gt;
&lt;td&gt;P0&lt;/td&gt;
&lt;td&gt;本地IDC&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TC-VM-002&lt;/td&gt;
&lt;td&gt;批量创建多台虚拟机并按序号命名&lt;/td&gt;
&lt;td&gt;P0&lt;/td&gt;
&lt;td&gt;本地IDC&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TC-VM-003&lt;/td&gt;
&lt;td&gt;使用有序后缀占位符 # 命名&lt;/td&gt;
&lt;td&gt;P2&lt;/td&gt;
&lt;td&gt;本地IDC&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TC-VM-004&lt;/td&gt;
&lt;td&gt;使用主机名表达式命名&lt;/td&gt;
&lt;td&gt;P2&lt;/td&gt;
&lt;td&gt;本地IDC&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TC-VM-005&lt;/td&gt;
&lt;td&gt;指定IP子网并手动配置静态IP&lt;/td&gt;
&lt;td&gt;P1&lt;/td&gt;
&lt;td&gt;本地IDC&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TC-VM-006&lt;/td&gt;
&lt;td&gt;管理员密码随机生成并在列表查看&lt;/td&gt;
&lt;td&gt;P0&lt;/td&gt;
&lt;td&gt;本地IDC&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TC-VM-007&lt;/td&gt;
&lt;td&gt;管理员密码关联密钥&lt;/td&gt;
&lt;td&gt;P1&lt;/td&gt;
&lt;td&gt;本地IDC&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TC-VM-008&lt;/td&gt;
&lt;td&gt;添加数据盘&lt;/td&gt;
&lt;td&gt;P1&lt;/td&gt;
&lt;td&gt;本地IDC&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TC-VM-009&lt;/td&gt;
&lt;td&gt;高级配置绑定弹性公网IP&lt;/td&gt;
&lt;td&gt;P2&lt;/td&gt;
&lt;td&gt;本地IDC&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TC-VM-010&lt;/td&gt;
&lt;td&gt;高级配置绑定安全组&lt;/td&gt;
&lt;td&gt;P2&lt;/td&gt;
&lt;td&gt;本地IDC&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TC-VM-011&lt;/td&gt;
&lt;td&gt;远程终端协议与显卡型号组合&lt;/td&gt;
&lt;td&gt;P2&lt;/td&gt;
&lt;td&gt;本地IDC&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TC-VM-012&lt;/td&gt;
&lt;td&gt;Windows镜像创建并远程连接&lt;/td&gt;
&lt;td&gt;P1&lt;/td&gt;
&lt;td&gt;本地IDC&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TC-VM-013&lt;/td&gt;
&lt;td&gt;从ISO启动创建虚拟机&lt;/td&gt;
&lt;td&gt;P2&lt;/td&gt;
&lt;td&gt;本地IDC&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TC-VM-014&lt;/td&gt;
&lt;td&gt;自定义数据（cloud-init）&lt;/td&gt;
&lt;td&gt;P2&lt;/td&gt;
&lt;td&gt;本地IDC&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TC-VM-015&lt;/td&gt;
&lt;td&gt;ARM架构镜像创建虚拟机&lt;/td&gt;
&lt;td&gt;P2&lt;/td&gt;
&lt;td&gt;本地IDC&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TC-VM-016&lt;/td&gt;
&lt;td&gt;ZStack平台创建虚拟机&lt;/td&gt;
&lt;td&gt;P1&lt;/td&gt;
&lt;td&gt;私有云&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TC-VM-017&lt;/td&gt;
&lt;td&gt;OpenStack平台创建虚拟机&lt;/td&gt;
&lt;td&gt;P1&lt;/td&gt;
&lt;td&gt;私有云&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TC-VM-018&lt;/td&gt;
&lt;td&gt;阿里云按量付费创建虚拟机&lt;/td&gt;
&lt;td&gt;P1&lt;/td&gt;
&lt;td&gt;公有云&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TC-VM-019&lt;/td&gt;
&lt;td&gt;公有云包年包月与到期释放&lt;/td&gt;
&lt;td&gt;P2&lt;/td&gt;
&lt;td&gt;公有云&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TC-VM-020&lt;/td&gt;
&lt;td&gt;必填项与非法值校验&lt;/td&gt;
&lt;td&gt;P0&lt;/td&gt;
&lt;td&gt;通用&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TC-VM-021&lt;/td&gt;
&lt;td&gt;虚拟机名称重复&lt;/td&gt;
&lt;td&gt;P1&lt;/td&gt;
&lt;td&gt;通用&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TC-VM-022&lt;/td&gt;
&lt;td&gt;无可用宿主机或IP子网时创建失败&lt;/td&gt;
&lt;td&gt;P1&lt;/td&gt;
&lt;td&gt;通用&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TC-VM-023&lt;/td&gt;
&lt;td&gt;创建过程状态流转&lt;/td&gt;
&lt;td&gt;P0&lt;/td&gt;
&lt;td&gt;通用&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TC-VM-024&lt;/td&gt;
&lt;td&gt;创建后生命周期操作与删除&lt;/td&gt;
&lt;td&gt;P0&lt;/td&gt;
&lt;td&gt;通用&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="tc-vm-001-本地idc创建linux虚拟机最小必填参数"&gt;TC-VM-001 本地IDC创建Linux虚拟机（最小必填参数）&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;优先级&lt;/strong&gt;：P0&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;前置条件&lt;/strong&gt;：本地IDC存在在线宿主机与可用 IP 子网，镜像列表中存在可用的 Linux 公共镜像。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;步骤&lt;/strong&gt;：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;使用 cloudadmin 登录，进入&amp;quot;资源管理/计算/主机/虚拟机&amp;quot;页面。&lt;/li&gt;
&lt;li&gt;单击顶部&amp;quot;本地IDC&amp;quot;页签，单击列表上方&amp;quot;新建&amp;quot;按钮。&lt;/li&gt;
&lt;li&gt;基本配置：区域选择默认区域，可用区选择存在在线宿主机的可用区。&lt;/li&gt;
&lt;li&gt;设置名称，如 &lt;code&gt;tc-vm-001&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;实例配置：数量保持 &lt;code&gt;1&lt;/code&gt;，平台选择&amp;quot;云联壹云&amp;quot;。&lt;/li&gt;
&lt;li&gt;规格配置：CPU 核数选择 &lt;code&gt;1&lt;/code&gt;，内存选择 &lt;code&gt;1G&lt;/code&gt;（或选择&amp;quot;不限&amp;quot;后挑选一个最小套餐）。&lt;/li&gt;
&lt;li&gt;镜像配置：操作系统选择公共镜像中的 Linux 镜像，如 &lt;code&gt;openEuler-Linux-24.03 LTS SP4-x86_64&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;系统盘：磁盘类型选择默认类型，容量不低于镜像的最小磁盘要求。&lt;/li&gt;
&lt;li&gt;登录配置：管理员密码选择&amp;quot;随机生成&amp;quot;。&lt;/li&gt;
&lt;li&gt;网络配置：网络选择&amp;quot;自动调度&amp;quot;或指定一个可用的 IP 子网。&lt;/li&gt;
&lt;li&gt;单击&amp;quot;新建&amp;quot;按钮。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;预期结果&lt;/strong&gt;：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;单击&amp;quot;新建&amp;quot;后弹出创建成功提示，页面跳转回虚拟机列表。&lt;/li&gt;
&lt;li&gt;列表中出现新建的虚拟机，名称为 &lt;code&gt;tc-vm-001&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;虚拟机状态由&amp;quot;创建中&amp;quot;流转为&amp;quot;运行中&amp;quot;。&lt;/li&gt;
&lt;li&gt;虚拟机的区域、可用区、镜像、规格与提交的配置一致。&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2 id="tc-vm-002-批量创建多台虚拟机并按序号命名"&gt;TC-VM-002 批量创建多台虚拟机并按序号命名&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;优先级&lt;/strong&gt;：P0&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;步骤&lt;/strong&gt;：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;按 TC-VM-001 的步骤进入新建页面，名称设置为 &lt;code&gt;tc-batch&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;实例配置中数量设置为 &lt;code&gt;3&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;其余参数保持与 TC-VM-001 一致，单击&amp;quot;新建&amp;quot;按钮。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;预期结果&lt;/strong&gt;：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;创建成功后列表中出现 3 台虚拟机。&lt;/li&gt;
&lt;li&gt;第一台名称为 &lt;code&gt;tc-batch&lt;/code&gt;，其余为 &lt;code&gt;tc-batch-1&lt;/code&gt;、&lt;code&gt;tc-batch-2&lt;/code&gt;（名称大于 1 台时，除第一台外其他以 &lt;code&gt;名称-1~N&lt;/code&gt; 表示）。&lt;/li&gt;
&lt;li&gt;3 台虚拟机均正常流转到&amp;quot;运行中&amp;quot;。&lt;/li&gt;
&lt;li&gt;3 台虚拟机分配到的 IP 地址互不冲突。&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2 id="tc-vm-003-使用有序后缀占位符--命名"&gt;TC-VM-003 使用有序后缀占位符 # 命名&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;优先级&lt;/strong&gt;：P2&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;步骤&lt;/strong&gt;：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;进入新建页面，名称设置为 &lt;code&gt;tc-host##&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;数量设置为 &lt;code&gt;2&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;其余参数保持默认，单击&amp;quot;新建&amp;quot;按钮。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;预期结果&lt;/strong&gt;：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;创建出的虚拟机名称为 &lt;code&gt;tc-host00&lt;/code&gt; 和 &lt;code&gt;tc-host01&lt;/code&gt;（一个 &lt;code&gt;#&lt;/code&gt; 占一个位置）。&lt;/li&gt;
&lt;li&gt;序号按占位符位数补零。&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2 id="tc-vm-004-使用主机名表达式命名"&gt;TC-VM-004 使用主机名表达式命名&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;优先级&lt;/strong&gt;：P2&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;步骤&lt;/strong&gt;：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;进入新建页面，名称设置为 &lt;code&gt;${region}-${zone}&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;其余参数保持默认，单击&amp;quot;新建&amp;quot;按钮。&lt;/li&gt;
&lt;li&gt;再以 &lt;code&gt;${host}&lt;/code&gt; 为名称创建一个虚拟机。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;预期结果&lt;/strong&gt;：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;名称按表达式求值，显示为&amp;quot;区域名-可用区名称&amp;quot;。&lt;/li&gt;
&lt;li&gt;变量名需小写，使用 &lt;code&gt;${host}&lt;/code&gt; 时显示为创建该虚拟机的宿主机名称。&lt;/li&gt;
&lt;li&gt;表达式中的变量按手册&amp;quot;主机名表达式举例说明&amp;quot;取值，不支持的变量名不生效或被原样输出。&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2 id="tc-vm-005-指定ip子网并手动配置静态ip"&gt;TC-VM-005 指定IP子网并手动配置静态IP&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;优先级&lt;/strong&gt;：P1&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;前置条件&lt;/strong&gt;：目标可用区存在可用 IP 子网，且子网内有未分配的 IP。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;步骤&lt;/strong&gt;：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;进入新建页面，在&amp;quot;网络配置&amp;quot;中选择&amp;quot;指定IP子网&amp;quot;。&lt;/li&gt;
&lt;li&gt;选择 VPC 与 IP 子网。&lt;/li&gt;
&lt;li&gt;单击&amp;quot;手动配置IP&amp;quot;按钮，填写一个子网网段内、且未被占用的 IP 地址。&lt;/li&gt;
&lt;li&gt;单击&amp;quot;确定&amp;quot;保存 IP 配置。&lt;/li&gt;
&lt;li&gt;完成其他参数配置后单击&amp;quot;新建&amp;quot;按钮。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;预期结果&lt;/strong&gt;：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&amp;ldquo;手动配置IP&amp;quot;对话框中填写的 IP 被正确保存并回显。&lt;/li&gt;
&lt;li&gt;虚拟机创建成功后，其 IP 地址与手动指定的地址一致。&lt;/li&gt;
&lt;li&gt;对同一 IP 重复创建第二台虚拟机时，创建失败或提示 IP 已被占用。&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2 id="tc-vm-006-管理员密码随机生成并在列表查看"&gt;TC-VM-006 管理员密码随机生成并在列表查看&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;优先级&lt;/strong&gt;：P0&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;步骤&lt;/strong&gt;：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;进入新建页面，在&amp;quot;登录配置&amp;quot;中管理员密码选择&amp;quot;随机生成&amp;rdquo;。&lt;/li&gt;
&lt;li&gt;完成其他参数配置后单击&amp;quot;新建&amp;quot;按钮。&lt;/li&gt;
&lt;li&gt;创建成功后，在虚拟机列表中找到该虚拟机，查看&amp;quot;密码&amp;quot;列。&lt;/li&gt;
&lt;li&gt;复制密码，使用该密码通过 VNC 或远程连接登录虚拟机。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;预期结果&lt;/strong&gt;：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&amp;ldquo;随机生成&amp;quot;不显示明文密码，创建后可在虚拟机列表的密码列查看并复制管理员密码。&lt;/li&gt;
&lt;li&gt;Linux 系统的管理员账号为 &lt;code&gt;root&lt;/code&gt;，Windows 系统为 &lt;code&gt;administrator&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;使用复制的密码可成功登录虚拟机。&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2 id="tc-vm-007-管理员密码关联密钥"&gt;TC-VM-007 管理员密码关联密钥&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;优先级&lt;/strong&gt;：P1&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;前置条件&lt;/strong&gt;：已存在至少一个密钥对。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;步骤&lt;/strong&gt;：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;在&amp;quot;登录配置&amp;quot;中管理员密码选择&amp;quot;关联密钥&amp;rdquo;。&lt;/li&gt;
&lt;li&gt;选择一个已有密钥。&lt;/li&gt;
&lt;li&gt;完成其他参数配置后单击&amp;quot;新建&amp;quot;按钮。&lt;/li&gt;
&lt;li&gt;创建成功后，使用对应私钥通过 SSH 登录虚拟机。&lt;/li&gt;
&lt;li&gt;未创建密钥时，尝试选择&amp;quot;关联密钥&amp;quot;。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;预期结果&lt;/strong&gt;：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;关联密钥后，虚拟机需使用私钥远程登录，不使用密码登录。&lt;/li&gt;
&lt;li&gt;使用配套私钥可成功登录。&lt;/li&gt;
&lt;li&gt;未创建密钥时&amp;quot;关联密钥&amp;quot;不可选或提示需先新建密钥。&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2 id="tc-vm-008-添加数据盘"&gt;TC-VM-008 添加数据盘&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;优先级&lt;/strong&gt;：P1&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;步骤&lt;/strong&gt;：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;在&amp;quot;磁盘配置&amp;quot;的系统盘区域确认磁盘类型与容量。&lt;/li&gt;
&lt;li&gt;在&amp;quot;数据盘&amp;quot;区域单击添加，设置磁盘类型、介质与容量。&lt;/li&gt;
&lt;li&gt;再添加一块数据盘（可选）。&lt;/li&gt;
&lt;li&gt;完成其他参数配置后单击&amp;quot;新建&amp;quot;按钮。&lt;/li&gt;
&lt;li&gt;创建成功后，在虚拟机详情页查看磁盘信息。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;预期结果&lt;/strong&gt;：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;数据盘为可选项，可添加多块，磁盘类型同系统盘。&lt;/li&gt;
&lt;li&gt;仅第一块数据盘支持选择磁盘类型，后续添加的数据盘类型与第一块一致。&lt;/li&gt;
&lt;li&gt;创建成功后详情页磁盘列表中包含所有配置的磁盘，容量与配置一致。&lt;/li&gt;
&lt;li&gt;数据盘已挂载到虚拟机，但&lt;strong&gt;不会自动分区&lt;/strong&gt;，需登录后手动分区。&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2 id="tc-vm-009-高级配置绑定弹性公网ip"&gt;TC-VM-009 高级配置绑定弹性公网IP&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;优先级&lt;/strong&gt;：P2&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;前置条件&lt;/strong&gt;：平台已配置可用的 EIP 线路。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;步骤&lt;/strong&gt;：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;展开&amp;quot;高级配置&amp;quot;，在&amp;quot;弹性公网IP&amp;quot;中选择&amp;quot;新建&amp;quot;。&lt;/li&gt;
&lt;li&gt;选择线路类型，网络计费方式选择&amp;quot;按带宽计费&amp;quot;，设置带宽（如 1Mbps）。&lt;/li&gt;
&lt;li&gt;完成其他参数配置后单击&amp;quot;新建&amp;quot;按钮。&lt;/li&gt;
&lt;li&gt;创建成功后，查看虚拟机的 EIP 信息。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;预期结果&lt;/strong&gt;：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;EIP 随虚拟机一并创建并绑定成功。&lt;/li&gt;
&lt;li&gt;虚拟机详情中可看到绑定的 EIP 及带宽配置。&lt;/li&gt;
&lt;li&gt;按带宽计费时，超过带宽的流量将丢包（可通过实际传输验证）。&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2 id="tc-vm-010-高级配置绑定安全组"&gt;TC-VM-010 高级配置绑定安全组&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;优先级&lt;/strong&gt;：P2&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;前置条件&lt;/strong&gt;：存在可用的安全组及其规则。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;步骤&lt;/strong&gt;：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;展开&amp;quot;高级配置&amp;quot;，在&amp;quot;安全组&amp;quot;中选择 1 个安全组。&lt;/li&gt;
&lt;li&gt;尝试选择超过 5 个安全组。&lt;/li&gt;
&lt;li&gt;完成参数配置（不超过上限）后单击&amp;quot;新建&amp;quot;按钮。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;预期结果&lt;/strong&gt;：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;可为虚拟机绑定安全组，最多支持 5 个，超过后无法继续选择或有明确提示。&lt;/li&gt;
&lt;li&gt;绑定后安全组规则生效，未放行的端口不可访问、已放行的端口可访问。&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2 id="tc-vm-011-远程终端协议与显卡型号组合"&gt;TC-VM-011 远程终端协议与显卡型号组合&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;优先级&lt;/strong&gt;：P2&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;前置条件&lt;/strong&gt;：云联壹云平台虚拟机。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;步骤&lt;/strong&gt;：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;展开&amp;quot;高级配置&amp;quot;，&amp;ldquo;远程终端协议&amp;quot;选择 &lt;code&gt;VNC&lt;/code&gt;，&amp;ldquo;显卡型号&amp;quot;依次尝试 &lt;code&gt;Standard&lt;/code&gt; 与 &lt;code&gt;QXL&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;将&amp;quot;远程终端协议&amp;quot;改为 &lt;code&gt;SPICE&lt;/code&gt;，观察&amp;quot;显卡型号&amp;quot;的可选项。&lt;/li&gt;
&lt;li&gt;保存创建并打开虚拟机的远程终端。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;预期结果&lt;/strong&gt;：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;VNC 协议下显卡型号可选 &lt;code&gt;Standard&lt;/code&gt; 和 &lt;code&gt;QXL&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;SPICE 协议下显卡型号仅可选 &lt;code&gt;QXL&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;远程终端可正常打开并显示虚拟机画面。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;备注&lt;/strong&gt;：VNC 无声音和 usb 传输，不适用于虚拟桌面；SPICE 在色彩、音频和 usb 方面表现较好，适用于虚拟桌面。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="tc-vm-012-windows镜像创建并远程连接"&gt;TC-VM-012 Windows镜像创建并远程连接&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;优先级&lt;/strong&gt;：P1&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;步骤&lt;/strong&gt;：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;进入新建页面，操作系统选择 Windows 类镜像（如 &lt;code&gt;windows_server_2022_...qcow2&lt;/code&gt;）。&lt;/li&gt;
&lt;li&gt;系统盘容量不低于镜像的最小磁盘要求。&lt;/li&gt;
&lt;li&gt;管理员密码选择&amp;quot;随机生成&amp;rdquo;。&lt;/li&gt;
&lt;li&gt;完成其他参数配置后单击&amp;quot;新建&amp;quot;按钮。&lt;/li&gt;
&lt;li&gt;创建成功后，在列表中复制管理员密码，打开远程终端连接。&lt;/li&gt;
&lt;li&gt;使用 &lt;code&gt;administrator&lt;/code&gt; 账号与复制的密码登录。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;预期结果&lt;/strong&gt;：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;虚拟机创建成功并进入&amp;quot;运行中&amp;rdquo;。&lt;/li&gt;
&lt;li&gt;远程终端可正常显示 Windows 登录界面。&lt;/li&gt;
&lt;li&gt;使用 &lt;code&gt;administrator&lt;/code&gt; 与复制到的密码可成功登录。&lt;/li&gt;
&lt;li&gt;若通过挂载 ISO 安装 Windows，安装完成后需另行安装 Virtio 驱动（驱动可在镜像市场-ISO 中获取）。&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2 id="tc-vm-013-从iso启动创建虚拟机"&gt;TC-VM-013 从ISO启动创建虚拟机&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;优先级&lt;/strong&gt;：P2&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;前置条件&lt;/strong&gt;：镜像列表中存在 ISO 格式的镜像。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;步骤&lt;/strong&gt;：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;进入新建页面，操作系统选择&amp;quot;从ISO启动&amp;quot;，选择一个 ISO 镜像。&lt;/li&gt;
&lt;li&gt;查看&amp;quot;登录配置&amp;quot;区域。&lt;/li&gt;
&lt;li&gt;完成其他参数配置后单击&amp;quot;新建&amp;quot;按钮。&lt;/li&gt;
&lt;li&gt;创建成功后打开远程终端，安装操作系统。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;预期结果&lt;/strong&gt;：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;选择&amp;quot;从ISO启动&amp;quot;后&lt;strong&gt;不支持&lt;/strong&gt;设置管理员密码，提示需在安装操作系统时设置。&lt;/li&gt;
&lt;li&gt;磁盘类型均显示为&amp;quot;数据盘&amp;quot;（显示不影响正常使用）。&lt;/li&gt;
&lt;li&gt;远程终端可进入 ISO 引导的安装界面。&lt;/li&gt;
&lt;li&gt;仅云联壹云和 VMware 平台支持从 ISO 启动。&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2 id="tc-vm-014-自定义数据cloud-init"&gt;TC-VM-014 自定义数据（cloud-init）&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;优先级&lt;/strong&gt;：P2&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;步骤&lt;/strong&gt;：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;展开&amp;quot;高级配置&amp;quot;，在&amp;quot;自定义数据&amp;quot;中以文本方式填入一段 shell 脚本（如创建文件、写入主机名）。&lt;/li&gt;
&lt;li&gt;完成参数配置后单击&amp;quot;新建&amp;quot;按钮。&lt;/li&gt;
&lt;li&gt;创建成功后登录虚拟机，检查脚本执行结果。&lt;/li&gt;
&lt;li&gt;再次以&amp;quot;上传json文件&amp;quot;的方式提交配置。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;预期结果&lt;/strong&gt;：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;文本与上传 json 文件两种方式均可提交。&lt;/li&gt;
&lt;li&gt;云联壹云平台支持 shell、python、perl 脚本；私有云和公有云平台支持 shell、yaml 脚本。&lt;/li&gt;
&lt;li&gt;虚拟机首次启动后脚本被执行，检查结果与脚本预期一致。&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2 id="tc-vm-015-arm架构镜像创建虚拟机"&gt;TC-VM-015 ARM架构镜像创建虚拟机&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;优先级&lt;/strong&gt;：P2&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;前置条件&lt;/strong&gt;：存在 ARM 架构的宿主机与 ARM 架构镜像。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;步骤&lt;/strong&gt;：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;进入新建页面，&amp;ldquo;CPU架构&amp;quot;选择 &lt;code&gt;ARM&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;查看操作系统镜像列表。&lt;/li&gt;
&lt;li&gt;引导方式选择 &lt;code&gt;UEFI&lt;/code&gt;，尝试选择 &lt;code&gt;BIOS&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;完成参数配置后单击&amp;quot;新建&amp;quot;按钮。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;预期结果&lt;/strong&gt;：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;仅云联壹云平台支持 ARM 架构，其他平台该选项不可用。&lt;/li&gt;
&lt;li&gt;CPU 架构为 ARM 时，镜像列表按架构过滤，仅展示 ARM 架构镜像。&lt;/li&gt;
&lt;li&gt;ARM 架构仅支持 &lt;code&gt;UEFI&lt;/code&gt; 引导方式，无法选择 BIOS。&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2 id="tc-vm-016-zstack平台创建虚拟机"&gt;TC-VM-016 ZStack平台创建虚拟机&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;优先级&lt;/strong&gt;：P1&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;前置条件&lt;/strong&gt;：云管平台已导入 ZStack 资源，且 ZStack 区域存在在线宿主机与可用 IP 子网。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;步骤&lt;/strong&gt;：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;进入虚拟机页面，单击顶部&amp;quot;私有云&amp;quot;页签。&lt;/li&gt;
&lt;li&gt;单击&amp;quot;新建&amp;quot;按钮，单击顶部&amp;quot;私有云&amp;quot;页签。&lt;/li&gt;
&lt;li&gt;选择 ZStack 对应的区域与可用区（区域用于确定虚拟机所属平台）。&lt;/li&gt;
&lt;li&gt;设置名称，选择规格与 ZStack 平台镜像。&lt;/li&gt;
&lt;li&gt;网络配置中选择可用的 IP 子网。&lt;/li&gt;
&lt;li&gt;单击&amp;quot;新建&amp;quot;按钮。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;预期结果&lt;/strong&gt;：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;虚拟机在 ZStack 平台上创建成功并进入&amp;quot;运行中&amp;rdquo;。&lt;/li&gt;
&lt;li&gt;列表中该虚拟机显示的所属平台为 ZStack。&lt;/li&gt;
&lt;li&gt;可通过远程终端与 SSH 正常访问。&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2 id="tc-vm-017-openstack平台创建虚拟机"&gt;TC-VM-017 OpenStack平台创建虚拟机&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;优先级&lt;/strong&gt;：P1&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;前置条件&lt;/strong&gt;：云管平台已导入 OpenStack 资源，且区域存在在线宿主机与可用 IP 子网。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;步骤&lt;/strong&gt;：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;在&amp;quot;私有云&amp;quot;页签下选择 OpenStack 对应的区域与可用区。&lt;/li&gt;
&lt;li&gt;选择镜像作为系统盘（OpenStack 支持以镜像为系统盘，镜像存储为系统盘存储）。&lt;/li&gt;
&lt;li&gt;系统盘配置完成后，尝试设置数据盘类型。&lt;/li&gt;
&lt;li&gt;完成网络与其他参数配置后单击&amp;quot;新建&amp;quot;按钮。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;预期结果&lt;/strong&gt;：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;虚拟机在 OpenStack 平台上创建成功并进入&amp;quot;运行中&amp;quot;。&lt;/li&gt;
&lt;li&gt;系统盘以镜像为存储时，数据盘类型可以设置。&lt;/li&gt;
&lt;li&gt;虚拟机的区域、平台、规格与提交配置一致。&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2 id="tc-vm-018-阿里云按量付费创建虚拟机"&gt;TC-VM-018 阿里云按量付费创建虚拟机&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;优先级&lt;/strong&gt;：P1&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;前置条件&lt;/strong&gt;：已导入可用且余额充足的阿里云云账号，对应区域存在 VPC 和 IP 子网。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;步骤&lt;/strong&gt;：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;进入虚拟机页面，单击顶部&amp;quot;公有云&amp;quot;页签，再单击&amp;quot;新建&amp;quot;按钮。&lt;/li&gt;
&lt;li&gt;计费方式选择&amp;quot;按量付费&amp;quot;。&lt;/li&gt;
&lt;li&gt;通过地域、平台、区域、可用区确定可选套餐，选择阿里云及就近区域。&lt;/li&gt;
&lt;li&gt;选择一个已有缓存标志的镜像（避免长时间缓存镜像）。&lt;/li&gt;
&lt;li&gt;选择 VPC 与 IP 子网，完成其他参数配置。&lt;/li&gt;
&lt;li&gt;单击&amp;quot;新建&amp;quot;按钮。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;预期结果&lt;/strong&gt;：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;虚拟机在阿里云上创建成功并同步到云管平台，状态为&amp;quot;运行中&amp;quot;。&lt;/li&gt;
&lt;li&gt;费用按实际使用量计费。&lt;/li&gt;
&lt;li&gt;使用未缓存镜像时创建时间较长，镜像名称右侧带有已缓存标志时创建较快。&lt;/li&gt;
&lt;li&gt;公有云仅按量付费的虚拟机支持&amp;quot;到期释放&amp;quot;。&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2 id="tc-vm-019-公有云包年包月与到期释放"&gt;TC-VM-019 公有云包年包月与到期释放&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;优先级&lt;/strong&gt;：P2&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;前置条件&lt;/strong&gt;：国内公有云云账号。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;步骤&lt;/strong&gt;：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;在&amp;quot;公有云&amp;quot;页签下新建虚拟机，计费方式选择&amp;quot;包年包月&amp;quot;。&lt;/li&gt;
&lt;li&gt;查看是否可勾选&amp;quot;自动续费&amp;quot;，并设置购买时长。&lt;/li&gt;
&lt;li&gt;切换计费方式为&amp;quot;按量付费&amp;quot;，设置&amp;quot;到期释放&amp;quot;为&amp;quot;1小时&amp;quot;。&lt;/li&gt;
&lt;li&gt;完成参数配置后单击&amp;quot;新建&amp;quot;按钮。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;预期结果&lt;/strong&gt;：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;包年包月为预付费模式，支持勾选自动续费。&lt;/li&gt;
&lt;li&gt;仅国内公有云支持包年包月；仅阿里云包年包月支持购买一周，选择一周时平台自动选择阿里云。&lt;/li&gt;
&lt;li&gt;阿里云按周购买的续费周期为一周，按月为一个月，按年为一年；其他平台续费周期均为一个月。&lt;/li&gt;
&lt;li&gt;到期释放仅按量付费的虚拟机支持，超时后虚拟机被删除并放入回收站。&lt;/li&gt;
&lt;li&gt;放入回收站后&lt;strong&gt;仍然收费&lt;/strong&gt;，需在回收站中清除。&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2 id="tc-vm-020-必填项与非法值校验"&gt;TC-VM-020 必填项与非法值校验&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;优先级&lt;/strong&gt;：P0&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;步骤&lt;/strong&gt;：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;进入新建页面，不填写任何内容直接单击&amp;quot;新建&amp;quot;按钮。&lt;/li&gt;
&lt;li&gt;依次补齐区域、名称、规格、镜像、网络等必填项，每补齐一项重新提交，观察提示变化。&lt;/li&gt;
&lt;li&gt;名称填写非法字符（如空格、&lt;code&gt;/&lt;/code&gt; 等特殊字符）。&lt;/li&gt;
&lt;li&gt;系统盘容量填写小于镜像最小磁盘容量的值。&lt;/li&gt;
&lt;li&gt;CPU 核数或内存填写超出宿主机剩余资源的规格。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;预期结果&lt;/strong&gt;：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;必填项缺失时提交被拦截，对应字段标红并提示&amp;quot;请输入/请选择 xxx&amp;quot;。&lt;/li&gt;
&lt;li&gt;所有必填项补齐前无法提交成功。&lt;/li&gt;
&lt;li&gt;非法名称被拦截并给出明确提示。&lt;/li&gt;
&lt;li&gt;系统盘容量小于镜像最小磁盘要求时不可提交或给出提示。&lt;/li&gt;
&lt;li&gt;规格超出可用资源时，该规格不可选或提交后创建失败并给出原因。&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2 id="tc-vm-021-虚拟机名称重复"&gt;TC-VM-021 虚拟机名称重复&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;优先级&lt;/strong&gt;：P1&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;前置条件&lt;/strong&gt;：已存在一台名为 &lt;code&gt;tc-dup&lt;/code&gt; 的虚拟机。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;步骤&lt;/strong&gt;：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;新建虚拟机，名称填写为已存在的 &lt;code&gt;tc-dup&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;完成其他参数配置后单击&amp;quot;新建&amp;quot;按钮。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;预期结果&lt;/strong&gt;：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;创建被拒绝，提示名称已存在。&lt;/li&gt;
&lt;li&gt;虚拟机和裸金属共用名称空间，尝试使用已有&lt;strong&gt;裸金属&lt;/strong&gt;的名称创建虚拟机时同样被拒绝。&lt;/li&gt;
&lt;li&gt;名称在系统中唯一。&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2 id="tc-vm-022-无可用宿主机或ip子网时创建失败"&gt;TC-VM-022 无可用宿主机或IP子网时创建失败&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;优先级&lt;/strong&gt;：P1&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;前置条件&lt;/strong&gt;：准备一个无在线宿主机的可用区，或一个 IP 已耗尽/不可用的子网。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;步骤&lt;/strong&gt;：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;新建虚拟机，可用区选择一个没有在线宿主机的可用区。&lt;/li&gt;
&lt;li&gt;完成其他参数配置后单击&amp;quot;新建&amp;quot;按钮。&lt;/li&gt;
&lt;li&gt;再选择一个宿主机在线、但 IP 子网不满足条件的场景重复提交。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;预期结果&lt;/strong&gt;：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;无可用宿主机时创建失败，提示无可用宿主机或调度失败。&lt;/li&gt;
&lt;li&gt;无可用 IP 子网时网络配置无法选择子网，或提交后失败并提示原因。&lt;/li&gt;
&lt;li&gt;若平台启用了主机申请流程（工单），则在参数校验通过后发起工单申请，审核完成后才自动部署；未启用时直接创建。&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2 id="tc-vm-023-创建过程状态流转"&gt;TC-VM-023 创建过程状态流转&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;优先级&lt;/strong&gt;：P0&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;步骤&lt;/strong&gt;：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;新建一台虚拟机，单击&amp;quot;新建&amp;quot;后立即观察列表中的状态。&lt;/li&gt;
&lt;li&gt;在虚拟机列表右上方查看各状态的数量统计。&lt;/li&gt;
&lt;li&gt;持续观察直到状态不再变化。&lt;/li&gt;
&lt;li&gt;打开该虚拟机的详情页，核对各项信息。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;预期结果&lt;/strong&gt;：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;提交后虚拟机先以&amp;quot;创建中&amp;quot;状态出现在列表中。&lt;/li&gt;
&lt;li&gt;创建成功后状态流转为&amp;quot;运行中&amp;quot;；创建失败时为&amp;quot;操作失败&amp;quot;。&lt;/li&gt;
&lt;li&gt;列表右上方显示虚拟机总数以及处于运行、关机、操作失败以及未知状态的虚拟机数量，且随状态变化实时更新。&lt;/li&gt;
&lt;li&gt;详情页中的名称、区域、可用区、规格、镜像、IP、磁盘等信息与提交配置一致。&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2 id="tc-vm-024-创建后生命周期操作与删除"&gt;TC-VM-024 创建后生命周期操作与删除&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;优先级&lt;/strong&gt;：P0&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;前置条件&lt;/strong&gt;：已完成 TC-VM-001，存在一台&amp;quot;运行中&amp;quot;的虚拟机。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;步骤&lt;/strong&gt;：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;在虚拟机列表中选择该虚拟机，执行&amp;quot;关机&amp;quot;。&lt;/li&gt;
&lt;li&gt;确认关机后，执行&amp;quot;开机&amp;quot;。&lt;/li&gt;
&lt;li&gt;执行&amp;quot;重启&amp;quot;。&lt;/li&gt;
&lt;li&gt;执行&amp;quot;删除&amp;quot;。&lt;/li&gt;
&lt;li&gt;删除后，在回收站中查看并执行清除。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;预期结果&lt;/strong&gt;：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;关机操作后状态变为&amp;quot;关机&amp;quot;，开机后恢复&amp;quot;运行中&amp;quot;。&lt;/li&gt;
&lt;li&gt;重启过程中远程终端连接会中断；若勾选&amp;quot;强制重启&amp;quot;，虚拟机中未保存的数据将会丢失。&lt;/li&gt;
&lt;li&gt;删除后虚拟机进入回收站，列表默认不再展示。&lt;/li&gt;
&lt;li&gt;回收站中可看到已删除的虚拟机，执行清除后彻底删除。&lt;/li&gt;
&lt;li&gt;云上虚拟机放入回收站后仍可能继续收费，不再使用时需及时清除。&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2 id="附录-a本环境资源实测快照"&gt;附录 A：本环境资源实测快照&lt;/h2&gt;
&lt;p&gt;以下数据在 &lt;a href="https://test.yunion.io" target="_blank" rel="noopener noreferrer"&gt;https://test.yunion.io&lt;/a&gt; 实测获取（2026-09-15），用于用例前置条件核查与参数取值参考。其他环境中资源名称不同，执行时按实际下拉列表替换即可。&lt;/p&gt;
&lt;h3 id="本地idc-1"&gt;本地IDC&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;项目&lt;/th&gt;
&lt;th&gt;实测值&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;区域&lt;/td&gt;
&lt;td&gt;&lt;code&gt;default&lt;/code&gt;（Beijing OneCloud）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;可用区&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Wangjing&lt;/code&gt;、&lt;code&gt;yunion&lt;/code&gt;、&lt;code&gt;test&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;在线宿主机（云联壹云/KVM）&lt;/td&gt;
&lt;td&gt;&lt;code&gt;test-69-onecloud01&lt;/code&gt;（40C/257923MB）、&lt;code&gt;test-66-onecloud02&lt;/code&gt;（40C/257755MB）、&lt;code&gt;ampere-10-127-100-7-10-127-100-7&lt;/code&gt;（32C/65079MB）、&lt;code&gt;test-d2000-01-10-127-100-8&lt;/code&gt;（8C/15929MB）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;在线宿主机（VMware/ESXi）&lt;/td&gt;
&lt;td&gt;&lt;code&gt;10-127-40-2&lt;/code&gt;（48C/131008MB）、&lt;code&gt;10-127-40-4&lt;/code&gt;（24C/98258MB）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;离线宿主机&lt;/td&gt;
&lt;td&gt;&lt;code&gt;esxi2&lt;/code&gt;、&lt;code&gt;bm15&lt;/code&gt;、&lt;code&gt;vbm1&lt;/code&gt;、&lt;code&gt;vbm2&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;guest IP子网（示例）&lt;/td&gt;
&lt;td&gt;&lt;code&gt;default-86&lt;/code&gt;（10.206.0.1 ~ 10.206.15.254，网关 10.206.0.1）、&lt;code&gt;default-85&lt;/code&gt;、&lt;code&gt;default-84&lt;/code&gt; 等，每个 VPC 下一个&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="私有云-1"&gt;私有云&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;平台&lt;/th&gt;
&lt;th&gt;区域&lt;/th&gt;
&lt;th&gt;可用区&lt;/th&gt;
&lt;th&gt;在线宿主机&lt;/th&gt;
&lt;th&gt;可用 IP 子网&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;ZStack&lt;/td&gt;
&lt;td&gt;&lt;code&gt;zs-test&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;ZONE-test&lt;/code&gt;、&lt;code&gt;zone2&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Host-test&lt;/code&gt;（12C/11824MB）&lt;/td&gt;
&lt;td&gt;有（每可用区约 50 个子网）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OpenStack&lt;/td&gt;
&lt;td&gt;&lt;code&gt;ops-test-RegionOne&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;nova&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;test-72-openstack01&lt;/code&gt;（40C/262050MB）&lt;/td&gt;
&lt;td&gt;有（约 50 个子网）&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="可用镜像示例"&gt;可用镜像（示例）&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;类型&lt;/th&gt;
&lt;th&gt;镜像名称&lt;/th&gt;
&lt;th&gt;架构&lt;/th&gt;
&lt;th&gt;最小磁盘&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;公共镜像&lt;/td&gt;
&lt;td&gt;&lt;code&gt;openeuler-24.03-lts-sp4-x86_64&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;x86_64&lt;/td&gt;
&lt;td&gt;40GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;公共镜像&lt;/td&gt;
&lt;td&gt;&lt;code&gt;openEuler-Linux-24.03 LTS SP2-x86_64&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;x86_64&lt;/td&gt;
&lt;td&gt;40GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;公共镜像&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Kylin-Server-10-SP2-aarch64-Release-Build09-20231122.qcow2&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;aarch64&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;其他&lt;/td&gt;
&lt;td&gt;&lt;code&gt;CentOS-Linux-7.9-x86_64-2009&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;x86_64&lt;/td&gt;
&lt;td&gt;8GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;其他&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Debian-Linux-14 (Forky)-x86_64-latest&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;x86_64&lt;/td&gt;
&lt;td&gt;3GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;其他&lt;/td&gt;
&lt;td&gt;&lt;code&gt;windows_server_2022_updated_july_2026_x86_64_20260820.qcow2&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;x86_64&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;其他&lt;/td&gt;
&lt;td&gt;&lt;code&gt;windows_11_pro_26h1_x86_64_20260816.qcow2&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;x86_64&lt;/td&gt;
&lt;td&gt;80GB&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote&gt;
&lt;p&gt;公共镜像（&lt;code&gt;is_public=true&lt;/code&gt;）在下拉列表的&amp;quot;公共镜像&amp;quot;分组中展示；其余图片多为自定义镜像或主机镜像，按实际分组选择。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="已有虚拟机"&gt;已有虚拟机&lt;/h3&gt;
&lt;p&gt;环境中已存在 &lt;code&gt;qj-ubuntu-tmp&lt;/code&gt;、&lt;code&gt;qj-test-w22&lt;/code&gt;、&lt;code&gt;test-rocky&lt;/code&gt;、&lt;code&gt;glb-test-4.0.4&lt;/code&gt; 等虚拟机，执行名称唯一性相关用例时注意避开这些名称。&lt;/p&gt;
&lt;h2 id="附录-b接口层验证"&gt;附录 B：接口层验证&lt;/h2&gt;
&lt;p&gt;创建过程的资源状态可通过接口快速核对。先执行 &lt;code&gt;verify_login.sh&lt;/code&gt; 取得登录凭证（见&lt;a href="../login"&gt;登录测试用例&lt;/a&gt;附录 A），然后：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;BASE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;https://test.yunion.io&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;COOKIE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/tmp/login_cookie.txt
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 查看虚拟机列表与状态&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;curl -s -b &lt;span class="nv"&gt;$COOKIE&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$BASE&lt;/span&gt;&lt;span class="s2"&gt;/api/v1/servers?limit=20&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;|&lt;/span&gt; python3 -c &lt;span class="s2"&gt;&amp;#34;import sys,json;[print(s[&amp;#39;name&amp;#39;],s[&amp;#39;status&amp;#39;],s.get(&amp;#39;hypervisor&amp;#39;)) for s in json.load(sys.stdin)[&amp;#39;data&amp;#39;]]&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 查看在线宿主机（创建前置条件核查）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;curl -s -b &lt;span class="nv"&gt;$COOKIE&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$BASE&lt;/span&gt;&lt;span class="s2"&gt;/api/v1/hosts?limit=50&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;|&lt;/span&gt; python3 -c &lt;span class="s2"&gt;&amp;#34;import sys,json;[print(h[&amp;#39;name&amp;#39;],h[&amp;#39;host_type&amp;#39;],h[&amp;#39;host_status&amp;#39;]) for h in json.load(sys.stdin)[&amp;#39;data&amp;#39;]]&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 查看可用 IP 子网（创建前置条件核查）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;curl -s -b &lt;span class="nv"&gt;$COOKIE&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$BASE&lt;/span&gt;&lt;span class="s2"&gt;/api/v1/networks?server_type=guest&amp;amp;limit=20&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;|&lt;/span&gt; python3 -c &lt;span class="s2"&gt;&amp;#34;import sys,json;[print(n[&amp;#39;name&amp;#39;],n[&amp;#39;guest_ip_start&amp;#39;],n[&amp;#39;guest_ip_end&amp;#39;]) for n in json.load(sys.stdin)[&amp;#39;data&amp;#39;]]&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 查看镜像列表&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;curl -s -b &lt;span class="nv"&gt;$COOKIE&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$BASE&lt;/span&gt;&lt;span class="s2"&gt;/api/v1/images?limit=20&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;|&lt;/span&gt; python3 -c &lt;span class="s2"&gt;&amp;#34;import sys,json;[print(i[&amp;#39;name&amp;#39;],i.get(&amp;#39;os_arch&amp;#39;),i.get(&amp;#39;disk_format&amp;#39;)) for i in json.load(sys.stdin)[&amp;#39;data&amp;#39;]]&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;接口中的 &lt;code&gt;status&lt;/code&gt; 取值与界面状态的对应关系：&lt;code&gt;running&lt;/code&gt; = 运行中、&lt;code&gt;ready&lt;/code&gt; = 关机、&lt;code&gt;start_fail&lt;/code&gt;/&lt;code&gt;create_fail&lt;/code&gt; = 操作失败。接口层仅用于快速核查环境与状态，&lt;strong&gt;界面交互、参数校验提示、工单流程等仍需按用例步骤在浏览器中执行&lt;/strong&gt;。&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>Docs: 测试用例</title><link>/docs/zh/docs/web_ui/testcase/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/docs/zh/docs/web_ui/testcase/</guid><description>
&lt;p&gt;本目录维护云联壹云 Web 控制台核心功能的测试用例，用于功能验证与版本回归。用例依据 &lt;a href="../"&gt;Web控制台手册&lt;/a&gt; 的功能描述编写，步骤与参数含义与手册保持一致。&lt;/p&gt;
&lt;h2 id="测试环境"&gt;测试环境&lt;/h2&gt;
&lt;p&gt;测试用例默认在以下环境执行，如在其他环境执行，请先按下文&amp;quot;环境差异&amp;quot;一节调整用例中的参数。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;项目&lt;/th&gt;
&lt;th&gt;值&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;控制台地址&lt;/td&gt;
&lt;td&gt;&lt;a href="https://test.yunion.io" target="_blank" rel="noopener noreferrer"&gt;https://test.yunion.io&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;管理员账号&lt;/td&gt;
&lt;td&gt;cloudadmin&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;管理员密码&lt;/td&gt;
&lt;td&gt;cloudadmin@test&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;默认域&lt;/td&gt;
&lt;td&gt;Default&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;默认视图&lt;/td&gt;
&lt;td&gt;管理后台视图（cloudadmin 为 Default 域 system 项目的 admin）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;本地IDC区域&lt;/td&gt;
&lt;td&gt;Default（Beijing OneCloud）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;本地IDC可用区&lt;/td&gt;
&lt;td&gt;test、yunion、Wangjing&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="用例编号规则"&gt;用例编号规则&lt;/h2&gt;
&lt;p&gt;用例编号格式为 &lt;code&gt;TC-&amp;lt;模块&amp;gt;-&amp;lt;序号&amp;gt;&lt;/code&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;TC-LOGIN-xxx&lt;/code&gt;：登录与退出相关用例，参见&lt;a href="login"&gt;登录&lt;/a&gt;。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;TC-VM-xxx&lt;/code&gt;：创建虚拟机相关用例，参见&lt;a href="vminstance-create"&gt;创建虚拟机&lt;/a&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;优先级说明：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;优先级&lt;/th&gt;
&lt;th&gt;含义&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;P0&lt;/td&gt;
&lt;td&gt;冒烟用例，每次版本发布必测&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;P1&lt;/td&gt;
&lt;td&gt;主要功能用例，版本回归必测&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;P2&lt;/td&gt;
&lt;td&gt;边界与组合场景，按需执行&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="通用约定"&gt;通用约定&lt;/h2&gt;
&lt;h3 id="前置条件"&gt;前置条件&lt;/h3&gt;
&lt;p&gt;执行任何用例前，需满足：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;浏览器可访问控制台地址，且能正常加载登录页；&lt;/li&gt;
&lt;li&gt;使用 cloudadmin 账号可正常登录；&lt;/li&gt;
&lt;li&gt;本地IDC区域存在&lt;strong&gt;在线&lt;/strong&gt;状态的宿主机（否则创建虚拟机的用例无法通过）；&lt;/li&gt;
&lt;li&gt;本地IDC区域存在&lt;strong&gt;可用&lt;/strong&gt;的 IP 子网（否则网络配置无法选择）。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;第 3、4 项的核查方法参见&lt;a href="vminstance-create"&gt;创建虚拟机&lt;/a&gt;的&amp;quot;环境核查&amp;quot;一节。&lt;/p&gt;
&lt;h3 id="结果记录"&gt;结果记录&lt;/h3&gt;
&lt;p&gt;每条用例执行后，在&amp;quot;实测结果&amp;quot;中记录：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;结论：通过 / 失败 / 阻塞；&lt;/li&gt;
&lt;li&gt;实际现象：与预期不一致时，记录界面提示原文；&lt;/li&gt;
&lt;li&gt;截图或接口响应：失败用例必附；&lt;/li&gt;
&lt;li&gt;执行人、执行时间、被测版本号。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="环境差异"&gt;环境差异&lt;/h3&gt;
&lt;p&gt;用例中的资源名称（镜像名、IP 子网名、宿主机名）取自 test.yunion.io 的实测快照，其他环境中这些名称大概率不同，执行时请按实际下拉列表中的可选项替换，&lt;strong&gt;不影响用例的判定标准&lt;/strong&gt;。&lt;/p&gt;
&lt;h2 id="用例目录"&gt;用例目录&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="login"&gt;登录&lt;/a&gt;：登录、登录安全、退出与会话，共 18 条用例。&lt;/li&gt;
&lt;li&gt;&lt;a href="vminstance-create"&gt;创建虚拟机&lt;/a&gt;：本地IDC、私有云、公有云创建虚拟机及各参数组合，共 24 条用例。&lt;/li&gt;
&lt;/ul&gt;</description></item></channel></rss>