po設計模式,pytest引入


po設計思想

1,什么是po

pageobject是一種涉及模式

減少冗余的代碼和對代碼進行管理

分離測試步驟及測試對象

2,po的好處

提高代碼復用率

集中管理定位信息,提高可維護行,

代碼可復用,降低成本,

不同po之間沒有交叉,可團隊並行開發

po設計原則

1,總的原則

封裝basepage,提取出來各個page中的公共方法

所有的po繼承basepage

2,方法封裝原則

共有的方法,點擊,輸入內容,獲取元素節點內容,等待

滑動頁面,執行js代碼等等

3,定位封裝原則

將每個po類的定位xpath分類做為類屬性進行封裝,命名風格統一,做到見名知意

pytest引入

pytest標記

@pytest.mark.skip 在用例方法上使用,即可跳過用例的執行

@pytest.mark.xfail 標記預期不會通過的用例

自定義

1,注冊標記:在啟動文件同級目錄下創建一個 pytest.ini的配置文件

2,在pytest.ini添加一個 pytest配置塊

3,在pytest的配置塊下面加一個mjarkers的配置項

4,在markers的配置項中去注冊標記

5,給對應的用例打標記,

@pytest.mark.注冊的標記名稱

[pytest] markers =  addicated  yuze  class_
  • 給類打標記
    1,直接在類上面打
    2,通過類屬性的pytestmark
class TestDome1:  pytestmark = [pytest.mark.class_, pytest.mark.musen]   def test_demo1_01(self):  assert 1 == 100   def test_demo1_02(self):  assert 100 == 100

斷言

assert斷言, 根據assert后面的表達式的結果是True還是False來決定是否斷言通過

原生的測試報告

pip install pytest-html

 

第一種 log 普通文本  TextTestRunner

 

--resultlog=report/demo.txt 相對路徑

第二種 xml,生成xml文件

--junitxml=report/demo.xml jenkins使用 html和xml 標記性語言

第三種 html HTMLTestRunner

--html=report/demo.html

 

用例編寫

pytest編寫用例,不使用ddt,因為不兼容,

pytest中使用pytest.mark.parameterize來實現數據驅動,給用例傳參

注意點

要么按照unittest的規則來寫,數據驅動,前后置都用unittest中的

要么按照pytest來寫,數據驅動,前后置都是pytest中的

回顧一下unittest中的ddt

# --------------------unittest中的數據驅動實現-------------------------- @ddt.ddt class TestClass(unittest.TestCase):   def setUp(self):  print("--用例的前置條件--")   @ddt.data(11, 22, 333, 444, 55)  def test_01(self, case):  assert case < 100   def tearDown(self):  print("--用例執行的后置條件--")

pytest的數據驅動實現

@pytest.mark.parametrize('case',[11,22,33,44,155]) def test_03(case):  assert case < 100

pytest的前后置方法

用例級別

@pytest.fixture() def case03_fixture():  # 前置條件  print("--------03----用例執行的前置條件--------------------")  yield  # 后置條件  print("---------03---用例執行的后置條件--------------------")

用例類級別

# 類級別的前置后置 @pytest.fixture(scope='class') def class_fixture():  # 前置條件  print("-------用例類-----執行的前置條件--------------------")  yield  # 后置條件  print("-------用例類-----執行的后置條件--------------------")

用例模塊級別

@pytest.fixture(scope='module', autouse=True) def module_fixture():  # 前置條件  print("-------模塊-----執行的前置條件--------------------")  yield  # 后置條件  print("-------模塊-----執行的后置條件--------------------")

會話級別

@pytest.fixture(scope='session', autouse=True) def session_fixture():  # 前置條件  print("-------會話級別-----執行的前置條件--------------------")  yield  # 后置條件  print("-------會話級別-----執行的后置條件--------------------")

前置條件與用例數據交互

@pytest.fixture() def case_fixture():  # 前置  driver = webdriver.Chrome()  expected = 200  yield driver, expected  # 后置  driver.quit()  # @pytest.mark.usefixtures("case_fixture") 這個使用方法, #只限於不需要將前置條件中的數據傳給用例的情況下 class TestLogin02:  """測試登錄"""  def test_login_pass(self, case_fixture):  """正常登錄的用例"""  driver, expected = case_fixture  driver.get("http://www.baidu.com")

使用一變量接收來自前置執行的結果,前置將需要返回給用例的內容卸載yield后,就可以直接接收,

注意:實例中注釋掉的方法只限於 不需要將前置中的數據傳給用例的情況下才適用。

pytest與unittest之間的對比

1,pytest兼容unittest,使用unittest寫的用例,可以通過pytest去執行

2,pytest寫用例更簡單

3,加載用例更智能

4,pytest可以對用例進行分類管理,執行用例更加的靈活

5,unittest是python中的官方庫,兼容性更好,更穩定,pytest在安裝的時候可能會出現同python版本的兼容問題

6,pytest支持的插件分廠豐富,功能擴展性強

7,pytest用例執行的前置后置處理更加高級


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM