1. 程式人生 > 實用技巧 >pytest簡介及jenkins整合

pytest簡介及jenkins整合

  1. pytest介紹

    • pytest介紹 - unittest\nose
      • pytest:基於unittest之上的單元測試框架
        1. 自動發現測試模組和測試方法
        2. 斷言使用assert+表示式即可
        3. 可以設定測試會話級、模組級、類級、函式級的fixtures 資料準備 + 清理工作
          • unittest:setUp、teardown、setUpClass、tearDownClass
          • 共享前置後置 -- conftest.py
        4. 有豐富的外掛庫,目前在900個以上 allure
      • 安裝命令
  2. pytest之mark功能

    • pytest - 收集測試用例

      • pytest收集測試用例的規則
        • 預設從當前目錄中搜集測試用例,即在哪個目錄下執行pytest命令,則從哪個目錄當中搜尋
        • 搜尋規則
          1. 符合命名規則 test_*.py 或者 *_test.py的檔案
          2. 以test開頭的函式名
          3. 以Test開頭的測試類(沒有__init__函式)當中,以test_開頭的函式
    • 對測試用例打標籤。在執行測試用例的時候,可根據標籤名來過濾要執行的用例

      • 使用方法

        • 註冊標籤名
        • 在測試用例/測試前面加上:@pytest.mark.已註冊的標記名
      • 註冊方式

        1. 建立pytest.ini檔案,在檔案中按如下形式新增標籤名:

          • [pytest]
            markers=
                slow:marks tests as slow(deselect with '-m "not slow"')
                serial
            
          • 注:冒號之後是可選的描述資訊

        2. 在conftest.py檔案當中,通過hook註冊

          • def pytest_configure(config):
                config.addinivalue_line("markers","smoke1:標記只執行冒煙用例")
                config.addinivalue_line("markers","demo1:示例執行")
            
      • 給用例打標記

        • 方式1

          • 打標記範圍:測試用例、測試類、模組檔案
          • 在測試用例/測試類前面加上:@pytest.mark.標記名
            • @pytest.mark.slow
          • 可在一個用例上打多個標籤,多次使用@pytest.mark.標記名即可
            • @pytest.mark.slow
            • @pytest.mark.serial
        • 方式2

          • 打標記範圍:測試用例、測試類、模組檔案

          • 在測試類裡,使用以下申明(測試類下,所有用例都被打上該標籤)

            • class TestClass(object):
                pytestmark = pytest.mark.已註冊標籤名
                pytestmark = [pytest.mark.標籤1, pytest.mark.標籤2] # 多標籤模式
              
          • 在模組檔案裡,同理(py檔案下,所有測試函式和測試類裡的測試函式,都有該標籤)

            • import pytest
              pytestmark = pytest.mark.已註冊標籤名
              pytestmark = [pytest.mark.標籤1, pytest.mark.標籤2] # 多標籤模式
              
  3. pytest之命令列執行用例

    • 安裝後,pytest.exe在python安裝目錄的Scripts目錄下,因為配置了環境變數後,可以之間執行pytest

    • 腳本里面是,效果通命令列

      • import pytest
        
        if __name__ == '__main__':
            pytest.main()
        
    • 只執行某個標記

      • pytest -m slow
      • pytest -m slow -s -v # 詳細輸出
  4. pytest之fixture功能

    • pytest之fixture引數化 - 多執行、pytest層級覆蓋。測試用例與其同級或者在其子目錄

    • 共享前置後置 -- conftest.py

      • 檔名不可更改,不需要引入就可以使用其中的fixture

      • 一個函式:前置+後置

        • yield分隔前置後置

        • 設定作用域:中間的夾的是什麼,預設"function"

          • @pytest.fixture
            def init_driver():
                # 前置
                pass
                # 分隔線
                yield	返回值寫在這
                # 後置
                pass
            
    • 呼叫fixture的三種方式

      1. 在測試用例中直接呼叫它

        • 將fixture的函式名作為測試用例的引數

        • 如果fixture有返回值,那麼測試用例中的fixture函式名字就接收返回值

        • eg

          • def test_xxx(self,myfixture):
                myfixture.find_element_by_xpath("xxx") # 函式名代表了fixture的返回值,即driver
            
      2. 用fixture裝飾器呼叫fixture

        • 在測試用例/測試類前面加上@pytest.mark.usefixtures("fixture函式名字")

        • ps:定義conftest.py檔案,在此檔案中可定義多個fixture,pytest會自動搜尋此檔案

        • @pytest.mark.usefixtures("init_driver")
          class TestLogin:
          
              @pytest.mark.slow
              def test_login_success(self, init_driver):
                  init_driver[1]. #返回值直接用,這裡返回元組
          
      3. 用autos呼叫fixture

        • 在定義fixture時,有一個引數是autouse,預設設定為False
        • 當預設為False,就可以選擇用上面兩種方式來試用fixture
        • 當設定為True時,在一個session內的所有test都會自動呼叫這個fixture(許可權大,責任也大,所以用該功能時也要謹慎小心)
  5. pytest之引數化

    • 在測試用例的前面加上

      • @pytest.mark.parametrize("引數名",列表資料)
      • 引數名:用來接收每一項資料,並作為測試用例的引數
      • 列表資料:一組測試資料
      • @pytest.mark.parametrize("引數1,引數2",[(資料1,資料2),(資料1,資料2)])
    • 示例

      • @pytest.mark.parametrize("aa,b,c", [(1, 3, 4), (10, 35, 45), (22.22, 22.22, 44.44)])
        def test_add(self, a, b, c):
            res = a + b
            assert res == c
        
    • 組合引數化:多組引數,依次組合

      • 使用多個@pytest.mark.parametrize

      • 示例

        • @pytest.mark.parametrize("x",[1,2])
          @pytest.mark.parametrize("y",[2,3])
          def test_foo(x,y):
            pass
          
        • 用例有四個1,2/1,3/2,2/2,3 笛卡爾積

  6. pytest之重執行

    • pytest提供了失敗重試機制
    • 外掛名稱rerunfailures
    • 安裝方法
      • pip install pytest-rerunfailures
    • 使用方式
      • 命令列引數形式
        • 命令:pytest --reruns 重試次數
          • 比如:pytest --reruns 2 表示:執行失敗的用例可以重新執行2次
        • 命令:pytest --reruns 重試次數 --reruns-delay 次數之間的延時設定(單位:秒)
          • pytest --reruns 2 --reruns-delay5
          • 表示失敗的用例可以重新執行2次,第一次和第二次的間隔時間為5秒鐘
  7. pytest之html測試報告

    • 需要安裝pytest-html外掛

    • pytest可以生成多種樣式的結果

      • 生成JunitXML格式的測試報告,命令
        • --junitxml=path
      • 生成result log格式的測試報告,命令
        • --resultlog=report\log.txt
      • 生成html格式的測試報告,命令
        • --html=report\test_one_func.html(相對路徑)
    • import pytest
      
      if __name__ == '__main__':
          pytest.main(["--reruns", "3", "--reruns-delay", "5", "-m", "fail",
                       "--html=Reports\\report.html", "--junitxml=Reports\\report.xml"])
      
  8. pytest之allure測試報告

    1. 安裝allure
      • 下載allure.zip
      • 下載地址
      • 解壓到本地目錄,配置allure.bat的環境變數ALLURE_HOME
        • 在命令列中執行allure,確認環境變數配置成功
    2. pytest外掛安裝
      • pip install allure-pytest
    3. pytest生成allure測試報告的命令引數
      • --alluredir=/XXX/my_allure_results
    4. 檢視allure的測試報告命令
      • allure serve allure報告目錄 相對/絕對
      • eg:allure serve D:\reports\allure
  9. pytest之jenkins整合

    • 安裝外掛Allure Jenkins Plugin

    • 配置工具路徑D:\allure-2.13.5

    • 配置時構建後操作生成allure報告,選擇allure report並配置路徑(相對)

    • 分散式

      • master/slave模式
        • 分擔jenkins伺服器的壓力,任務分配到其它執行機來執行
        • master:jenkins伺服器
        • slave:執行機(奴隸機),執行master分配的任務,並返回任務的進度和結果
        • master
          • 管理節點
          • 分配任務
        • slave
          • 反饋狀態
          • 反饋任務進度
          • 反饋任務結果
      • master/slave
        • slave向master註冊
        • slave的狀態,空閒/忙碌
        • slave的能力,可並行執行任務
    • 配置

      • 節點管理新建節點
      • 全域性設定--代理--選擇”隨機選取“
      • 節點管理新建節點
        • 名字 - 可以唯一指定
        • 執行器數量 - 可以同時執行的任務數
        • 遠端工作目錄 - 執行機的目錄,會自動在該目錄下建立workspace,並建相應的job目錄
        • 標籤 - 可以指定一組中隨機一個執行
        • 用法 - 指定
        • 啟動方式 - Launch agent by connecting it to the master(利用java web連線)
        • 可用性 - 儘可能使用
        • 節點屬性
          • 可以設定執行機的環境變數和工具
      • 連線
        • 連線處下載slave-agent.jnlp直接在執行機執行
          • 可以安裝為系統服務,這樣的化可以靜默執行
          • 連線後就可以運行了
        • 或者在命令列中啟動節點
      • 可以執行了