<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                [TOC] ## **一、跳過用例** ~~~ 分類: 1.直接跳過 語法: unittest.skip(說明) 場景:一般適合功能未實現完成用例 2.條件滿足跳過 語法: unittest.skipIf(條件,原因) 場景:一般判斷條件滿足,就不執行;如:達到指定版本,此功能失效; 提示: 以上兩種方式,都可以修飾函數和類; ~~~ <br /> ## **二、HTML測試報告** ~~~ HTML報告:根據 TextTestrunner改編而來 操作: 1.導包 from xx.HTMLTestRunner import HTMLTestRunner 2.定義測試套件 suite unittest defaultTestLoader.discover("../case", pattern="test*.py) 3.實例化 HTMLTestRunner類,并調用run方法執行測試套件。 with open(報告存放路徑, "wb") as f: #注意:生成html報告,必須使用wb,以二進制形式寫入 # 實例化HTMLTestRunner類 HTMLTestRunner(stream=f).run(測試套件) ~~~ <details> <summary>run_html.py</summary> ``` # run_html.py ''' 目標:基于unittest框架執行生成html版報告 操作: 1.復制 HtmlTestRunner.py文件到指定目錄 2.導包 from HTMLTestRunner import HTMLTestRunner 3.獲取報告存放文件流,并實例化 HTMLTestRunner類,執行run方法 ''' import unittest import time from day06.tools.HTMLTestRunner import TextTestRunner suite = unittest.defaultTestLoader.discover("../case", pattern="test*.py") report_dir = "../report{}.html".format(time.strftime("%Y_%m_%d_%H_%M_%S")) with open(report_dir, "wb") as f: TextTestRunner(stream=f, verbosity=2, title="xxx項目自動化測試報告", descriptions="macOS系統") ``` </details> <br /> <details> <summary>test03_open_with.py</summary> ``` # test03_open_with.py ''' 目標:open 與 with open 的區別 1.共同點:打開文件 2.不同點:with open = 執行打開操作+關閉操作 ''' f = None try: f = open("../report/text.txt", "r", encoding="utf-8") print(f.read()) except: pass finally: f.close() '''with open 極力推薦''' # 讀取 with open("../report/text.text.txt", "r", encoding="utf-8") as f: f.read() # 寫入 with open("../report/text.text.txt", "w", encoding="utf-8") as f: f.read() ''' 文件流:打開指定寫入的文件 ''' ``` </details> <br /> ## **三、po案例** ~~~ 版本: v1:不采用任何模式(線性模型) v2:采用測試框 unittest v3:業務代碼和頁面對象進行 v4:實際中的po模式編寫 案例: tpshop:登錄 1.賬號不存在 2.密碼錯誤 問題: v1:無法批量運行 v2:業務腳本與頁面對象沒有分開 PO介紹: PO:page(頁面) object(對象) ~~~ <details> <summary>v1/test_login_password_error.py</summary> ``` # v1/test_login_password_error.py from selenium import webdriver driver = webdriver.Chrome() driver.maximize_window() driver.implicitly_wait(30) driver.get("https://account.cnblogs.com/signin") # 打開登錄鏈接 driver.find_element_by_partial_link_text("登錄").click() # 輸入用戶名 driver.find_element_by_css_selector("#username").send_keys("130111222") # 輸入密碼 driver.find_element_by_css_selector("#password").send_keys("123456") # 輸入驗證碼 driver.find_element_by_css_selector("#verify_code").send_keys("8888") # 點擊登錄按鈕 driver.find_element_by_css_selector(".J-login-submit").click() # 獲取錯誤提示信息 msg = driver.find_element_by_css_selector(".layui-layer-content").text # 斷言 assert msg == "密碼錯誤!" # 點擊提示框確定按鈕 driver.find_element_by_css_selector("./layui-btn0").click() # 關閉 driver.quit() ``` </details> <br /> <details> <summary>v2/test_login.py</summary> ``` # v2/test_login.py import unittest from selenium import webdriver class TestLogin(unittest.TestCase): # 初始化 setUp def setUp(self): self.driver = webdriver.Chrome() self.driver.maximize_window() self.driver.implicitly_wait(30) self.driver.get("https://account.cnblogs.com/signin") # 打開登錄鏈接 self.driver.find_element_by_partial_link_text("登錄").click() # 結束 tearDown def tearDown(self): pass # 新建測試方法 用戶名不存在 def test_login_username_not_exist(self): # 輸入用戶名 self.driver.find_element_by_css_selector("#username").send_keys("130111222") # 輸入密碼 self.driver.find_element_by_css_selector("#password").send_keys("123456") # 輸入驗證碼 self.driver.find_element_by_css_selector("#verify_code").send_keys("8888") # 點擊登錄按鈕 self.driver.find_element_by_css_selector(".J-login-submit").click() # 獲取錯誤提示信息 msg = self.driver.find_element_by_css_selector(".layui-layer-content").text try: # 斷言 self.assertEqual(msg, "賬號不存在!") # 點擊提示框確定按鈕 self.driver.find_element_by_css_selector("./layui-btn0").click() except AssertionError: # 截圖 self.driver.get_screenshot_as_file("../image/fail.png") # 新建測試方法 密碼錯誤 def test_login_password_err(self): # 輸入用戶名 self.driver.find_element_by_css_selector("#username").send_keys("130111222") # 輸入密碼 self.driver.find_element_by_css_selector("#password").send_keys("123456") # 輸入驗證碼 self.driver.find_element_by_css_selector("#verify_code").send_keys("8888") # 點擊登錄按鈕 self.driver.find_element_by_css_selector(".J-login-submit").click() # 獲取錯誤提示信息 msg = self.driver.find_element_by_css_selector(".layui-layer-content").text try: # 斷言 self.assertEqual(msg, "密碼錯誤!") # 點擊提示框確定按鈕 self.driver.find_element_by_css_selector("./layui-btn0").click() except AssertionError: # 截圖 self.driver.get_screenshot_as_file("../image/fail.png") ``` </details> <br /> ``` v版本: 結構: 1. base(基類):page頁面公共的方法 # Base類 # 初始化方法 # 查找元素方法 # 點擊元素方法 # 輸入方法 # 獲取文本方法 # 截圖方法 注意: 1. 以上方法封裝時候,解包只需1此,在查找元素解包; 2. driver為虛擬,誰調用base時,誰傳入,無需關注從哪里來; 3. 1oc: 真正使用1oc的方法只有查找元素方法用; 2.page(頁面對象):一個頁面封裝成一個對象 應用: 繼承base 實現: 1.模塊名: page+實際操作模塊名稱 如:page_1ogin.py; 2.頁面對象名: 以大駝峰方法將模塊名抄進來,有下劃線去掉下劃線; 3.方法: 涉及元素,將每個元素操作單獨封裝一個操作方法; 4.組裝: 根據需求組裝以上操作步驟; 3. scripts(業務層): 導包調用page頁面 實現: 1.模塊:test+實際操作模塊名稱如:test_1ogin.py 2.測試業務名稱:以大駝峰方法將模塊名抄進來,有下劃線去掉下劃線 3.方法: 1.初始化方法 setUp() 注:在 unittest框架中不能使用 def __init__()初始化方法; # 實例化頁面對象 # 前置操作 如:打開等等 2.結束方法 teardown # 關閉驅動 3.測試方法 # 根據要操作的業務來實現 擴展: loc變量:類型為元組;*loc為解包; ``` ![E58865E8-4D54-46E2-B15A-2159F574CED4.jpg](https://i.loli.net/2021/01/17/MwJkgaWBRVpPUeo.jpg) <details> <summary>base/base.py</summary> ``` # base/base.py from selenium.webdriver.support.wait import WebDriverWait from selenium import webdriver class Base: # 初始化 def __init__(self, driver): # self.driver = driver # 臨時代替driver self.driver = webdriver.Chrome() self.driver.maximize_window() self.driver.get("http://localhost") # 查找元素方法(提供:點擊、輸入、獲取文本)使用 def base_find_lement(self, loc, timeout=30, poll=0.5): return WebDriverWait(self.driver, timeout=timeout, poll_frequency=poll).\ until(lambda x:x.find_element(*loc)) # 點擊方法 def base_click(self, loc): self.base_find_lement(loc).click() # 輸入方法 def base_input(self, loc, value): el = self.base_find_lement(loc) # 清空 el.clear() # 輸入 el.send_keys(value) # 獲取文本 def base_get_text(self, loc): # 注意:一定要返回元素的文本信息 return self.base_find_lement(loc).text # 截圖方法 def base_get_image(self): self.driver.get_screenshot_as_file("../image/fail.png") ``` </details> <br /> <details> <summary>page/__init__.py</summary> ``` # page/__init__.py from selenium.webdriver.common.by import By '''以下為登錄頁面元素配置信息,臨時存放地''' # 登錄鏈接 login_link = By.PARTIAL_LINK_TEXT, "登錄" # 用戶名 login_username = By.ID, "username" # 密碼 login_pwd = By.ID, "password" # 驗證碼 login_verify_code = By.ID, "verify_code" # 登錄按鈕 login_btn = By.CSS_SELECTOR, ".j-login-submit" # 獲取異常文本信息 login_err_info = By.CSS_SELECTOR, ".layui-layer-content" # 點擊異常提示框 按鈕 login_err_btn_ok = By.CSS_SELECTOR, "./layui-layer--btn0" ``` </details> <br /> <details> <summary>page/page_login.py</summary> ``` # page/page_login.py from day06_02.v4 import page from day06_02.v4.base import Base class PageLogin(Base): # 點擊登錄鏈接 def page_click_login_link(self): self.base_click(page.login_link) # 輸入用戶名 def page_input_username(self, username): self.base_input(page.login_username, username) # 輸入密碼 def page_input_password(self, pwd): self.base_input(page.login_pwd, pwd) # 輸入驗證 def page_input_verify_code(self, code): self.base_input(page.login_verify_code, code) # 點擊登錄按鈕 def page_click_login_btn(self): self.base_click(page.login_btn) # 獲取異常提示信息 def page_get_error_info(self): return self.base_get_text(page.login_err_info) # 點擊異常信息框 【確定】按鈕 def page_click_err_btn_ok(self): self.base_click(page.login_err_btn_ok) # 截圖 def page_get_screenshot(self): self.base_get_image() # 組合業務方法 def page_login(self, username, pwd, code): self.page_input_username(username) self.page_input_password(pwd) self.page_input_verify_code(code) self.page_click_login_btn() ``` </details> <br /> <details> <summary>scripts/test_login.py</summary> ``` # scripts/test_login.py import unittest from day06_02.v4.page_login import PageLogin from parameterized import parameterized def get_data(): return [("138111222", "123456", "8888", "賬號不存在!"), ("1380003333", "123123", "8888", "密碼錯誤!")] class TestLogin(unittest.TestCase): login = None @classmethod def setUpClass(cls): # 實例化 獲取頁面對象 PageLogin cls.login = PageLogin() # 點擊登錄鏈接 cls.login.page_click_login_link() @classmethod def tearDownClass(cls): # 關閉 driver驅動對象 cls.login.driver.quit() # 登錄測試方法 @parameterized.expand(get_data()) def test_login(self, username, pwd, code, except_result): # 調用登錄方法 self.login.page_login(username, pwd, code) # 獲取登錄提示信息 msg = self.login.page_get_error_info() try: # 斷言 self.assertEqual(msg, except_result) except AssertionError: # 截圖 self.login.page_get_img() ``` </details> <br />
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看