pytest+jenkins+allure 生成測試報告發送郵件

 

 

 

前言

本次集成示意圖html

image.png

解釋:python

  1. 代碼來自IDE、SVN、GIT、xCopy 此處咱們用的IDE commit代碼到 git(State)緩存區狀態git

  2. 多人協同的話merge代碼到git(State), 不然直接 push 代碼到中央倉庫 (此處咱們用Gitee)github

  3. 若是推送成功,程序根據預先設置的webhook進行飛書機器人提醒web

  4. jenkins有兩種方式檢測是否進行拉取代碼進行構建正則表達式

    • 自帶的post build插件,自動檢檢測到代碼有合併 ,trigger拉取事件進行CICD流程shell

    • 手工設置定時任務進行觸發 ,即SchemeTask定時任務json

  5. 構建成功,發送郵件到飛書郵箱 windows

  6. 飛書郵箱裏的URL地址連接打開連接到jenkins上關聯的報告,報告可否打開取決於先前在jenkins上設置的權限認證,匿名用戶配置具備查看Job 以及報告的權限瀏覽器

第一部分:Pycharm for Gitee

1. pycharm安裝gitee插件

點擊File

image.png

點擊Settings...

彈出

image.png

點擊Plugins

image.png

輸入gitee,以下圖

image.png

點擊Search in repositories

彈出下圖

image.png

點擊Install(綠色的)

等待安裝便可

而後到從新啓動pycharm

image.png

看到上圖的Checkout from Version Control下有Gitee

說明安裝成功了

2. gitee關聯本地Git

快速設置— 若是你知道該怎麼操做,直接使用下面的地址

image.png

強烈建議全部的git倉庫都有一個README, LICENSE, .gitignore文件

Git入門?查看 幫助 , Visual Studio / TortoiseGit / Eclipse / Xcode 下如何鏈接本站, 如何導入倉庫

簡易的命令行入門教程:

Git 全局設置:

git config --global user.name "Young"
git config --global user.email "vincentsys@yeah.net"

建立 git 倉庫:

mkdir test
cd test
git init
touch README.md
git add README.md
git commit -m "first commit"
git remote add origin https://gitee.com/vincentsys/test.git
git push -u origin master

已有倉庫 ?

cd existing_git_repo
git remote add origin https://gitee.com/vincentsys/test.git
git push -u origin master

 

3. Git關聯遠程倉庫

一.本地安裝GIT版本控制軟件

img

二.配置Git,設置用戶信息

git config --global user.name "Youngg"

git config --global user.email "vincentsys@yeah.net"

git config --list 獲取Git配置信息

注意:git config命令的--global參數,用了這個參數,表示你這臺機器上全部的Git倉庫都會使用這個配置,固然也能夠對某個倉庫指定不一樣的用戶名和Email地址。

三.Git鏈接遠程倉庫Gitee

  1. 在本地根據配置帳戶(user.name)生成密鑰

  命令: ssh-keygen -t rsa -C "vincentsys@yeah.net"

img

  1. 在GitHub裏配置密鑰

    登陸GitHub帳戶,在SSH keys裏添加sshkey(打開.ssh文件下的 id_rsa.pub文件把密鑰複製到Gitee

img

 

 

 

 

 

 

 

  1. 檢驗是否連接上了github

img

The authenticity of host 'github.com (192.30.252.131)' can't be establis

RSA key fingerprint is 16:27:ac:a5:76:28:2d:36:63:1b:56:4d:eb:df:a6:48.

直接yes

img

鏈接成功!

四.本地遠程倉庫關聯

  1. 在Gitee上建立倉庫

img

img

  1. 本地建立倉庫

img

  1. 本地倉庫鏈接遠程倉庫

img

  1. 遠程本地倉庫同步

img

  1. 修改本地提交遠程

    @1.添加文件

img

@2.把文件添加到版本庫

第一步 git add 0701.txt ,命令git add告訴Git,把文件添加到倉庫

img

第二步git commit -m 'first commit 命令git commit告訴Git,把文件提交到倉庫,

-m後面輸入的是本次提交的說明,能夠輸入任意內容,固然最好是有意義的,這樣你就能從歷史記錄裏方便地找到改動記錄。

img

@3.把本地推送到遠程

img

此時已提交到遠程

img

常遇問題

img

img

 

 

第二部分:Jenkins for Gitee

(一)簡介

Gitee Jenkins Plugin 是Gitee基於 GitLab Plugin 開發的 Jenkins 插件。用於配置 Jenkins 觸發器,接受Gitee平臺發送的 WebHook 觸發 Jenkins 進行自動化持續集成或持續部署,並可將構建狀態反饋回Gitee平臺。

1. 目前支持特性:
  • 推送代碼到Gitee時,由配置的 WebHook 觸發 Jenkins 任務構建。

  • 評論提交記錄觸發提交記錄對應版本 Jenkins 任務構建

  • 提交 Pull Request 到Gitee項目時,由配置的 WebHook 觸發 Jenkins 任務構建,支持PR動做:新建,更新,接受,關閉,審查經過,測試經過。

  • 支持 [ci-skip] 指令過濾 或者 [ci-build] 指令觸發構建。

  • 過濾已經構建的 Commit 版本,如果分支 Push,則相同分支Push才過濾,如果 PR,則是同一個PR才過濾。

  • 按分支名過濾觸發器。

  • 正則表達式過濾可觸發的分支。

  • 設置 WebHook 驗證密碼。

  • 構建後操做可配置 PR 觸發的構建結果評論到Gitee對應的PR中。

  • 構建後操做可配置 PR 觸發的構建成功後可自動合併對應PR。

  • 對於 PR 相關的全部事件,若 PR 代碼衝突不可自動合併,則不觸發構建;且若配置了評論到PR的功能,則評論到 PR 提示衝突。

  • PR 評論可經過 WebHook 觸發構建(可用於 PR 觸發構建失敗是便於從Gitee平臺評論從新觸發構建)

  • 支持配置 PR 不要求必須測試時過濾觸發構建。(可用於不需測試則不構建部署測試環境)

  • 支持相同 PR 觸發構建時,取消進行中的未完成構建,進行當前構建(相同 PR 構建不排隊,多個不一樣 PR 構建仍需排隊)

2. 計劃中特性
  1. PR 審查並測試經過觸發構建(可用戶觸發部署,且可配合自動合併 PR 的特性完善工做流。)

  2. 勾選觸發方式自動添加WebHook至Gitee。

(二)插件安裝

  1. 在線安裝

    • 前往 Manage Jenkins -> Manage Plugins -> Available

    • 右側 Filter 輸入: Gitee

    • 下方可選列表中勾選 Gitee(如列表中不存在 Gitee,則點擊 Check now 更新插件列表)

    • 點擊 Download now and install after restart

輸入圖片說明

  1. 手動安裝

    • release 列表中進入最新發行版,下載對應的 XXX.hpi 文件

    • 前往 Manage Jenkins -> Manage Plugins -> Advanced

    • Upload Plugin File 中選擇剛纔下載的 XXX.hpi 點擊 Upload

    • 後續頁面中勾選 Restart Jenkins when installation is complete and no jobs are running

輸入圖片說明

(三)插件配置

1. 添加Gitee連接配置
  1. 前往 Jenkins -> Manage Jenkins -> Configure System -> Gitee Configuration -> Gitee connections

  2. Connection name 中輸入 Gitee 或者你想要的名字

  3. Gitee host URL 中輸入Gitee完整 URL地址: https://gitee.com (Gitee私有化客戶輸入部署的域名)

  4. Credentials 中如還未配置Gitee APIV5 私人令牌,點擊 Add - > Jenkins

    1. Domain 選擇 Global credentials

    2. Kind 選擇 Gitee API Token

  5. Scope 選擇你須要的範圍

    1. Gitee API Token 輸入你的Gitee私人令牌,獲取地址:https://gitee.com/profile/personal_access_tokens

  6. ID, Descripiton 中輸入你想要的 ID 和描述便可。

  7. Credentials 選擇配置好的 Gitee APIV5 Token

  8. 點擊 Advanced ,可配置是否忽略 SSL 錯誤(視您的Jenkins環境是否支持),並可設置連接測超時時間(視您的網絡環境而定)

  9. 點擊 Test Connection 測試連接是否成功,如失敗請檢查以上 3,5,6 步驟。

配置成功後如圖所示: Gitee連接配置

2. 新建構建任務

前往 Jenkins -> New Item , name 輸入 'Gitee Test',選擇 Freestyle project 保存便可建立構建項目。

3. 任務全局配置

任務全局配置中須要選擇前一步中的Gitee連接。前往某個任務(如'Gitee Test')的 Configure -> General,Gitee connection 中選擇前面所配置的Gitee連接,如圖:

任務全局配置

4. 源碼管理配置

前往某個任務(如'Gitee Test')的 Configure -> Source Code Management 選項卡

  1. 點擊 Git

  2. 輸入你的倉庫地址,例如

    git@your.gitee.server:gitee_group/gitee_project.git
    1. 點擊 Advanced 按鈕, Name 字段中輸入 originRefspec 字段輸入 +refs/heads/*:refs/remotes/origin/* +refs/pull/*/MERGE:refs/pull/*/MERGE ,注意新版jenkins再也不接受多條同時包含 * 通配符的refs描述,如只對push觸發可寫前半部分,如只對PR觸發可只寫後半段。具體可見下圖:輸入圖片說明

  3. 憑據Credentials 中請輸入 git 倉庫 https 地址對應的 用戶名密碼憑據,或者 ssh 對應的 ssh key 憑據,注意 Gitee API Token 憑據不可用於源碼管理的憑據,只用於 gitee 插件的 API 調用憑據。

  4. Branch Specifier選項:

    1. 對於單倉庫工做流輸入: origin/${giteeSourceBranch}

  5. 對於 PR 工做流輸入: pull/${giteePullRequestIid}/MERGE

  6. Additional Behaviours選項:

    1. 對於單倉庫工做流,若是你但願推送的分支構建前合併默認分支(發佈的分支),能夠作如下操做:

    2. 點擊 Add 下拉框

      1. 選擇 Merge before build

    3. 設置 Name of repositoryorigin

      1. 設置 Branch to merge to${ReleaseBranch} 即您要合併的默認分支(發佈分支)

    4. 對於 PR 工做流,Gitee服務端已經將 PR 的原分支和目標分支做了預合併,您能夠直接構建,若是目標分支不是默認分支(發佈分支),您也能夠進行上訴構建前合併。

配置如圖所示:

源碼管理配置

5. 觸發器配置

前往任務配置的觸發器構建: Configure -> Build Triggers 選項卡

  1. Enabled Gitee triggers 勾選您所須要的構建觸發規則,如 Push Event, Opened Merge Request Events,勾選的事件會接受WebHook,觸發構建。目前支持觸發事件有:

    • Push Events :推送代碼事件

    • Commit Comment Events :評論提交記錄事件

  • Opened Merge Request Events :提交 PR 事件

    • Updated Merge Request Events :更新 PR 事件

  • Accepted Merge Request Events :接受/合併 PR 事件

    • Closed Merge Request Events :關閉 PR 事件

  • Approved Pull Requests : 審查經過 PR 事件

    • Tested Pull Requests :測試經過 PR 事件

  1. Build Instruction Filter :

    • None : 無過濾

    • [ci-skip] skip build :commit message 或者 PR 說明包含 [ci-skip] 時,跳過構建觸發。

  • [ci-build] trigger build :commit message 或者 PR 說明包含 [ci-build] 時,觸發構建。

  1. Ignore last commit has build 該選項能夠跳過已經構建過的 Commit 版本。

  2. Cancel incomplete build on same Pull Requests 該選項在 PR 觸發構建時,會判斷是否存在相同 PR 且未完成的構建,有則取消未完成構建,再進行當前構建。

  3. Ignore Pull Request conflicts 該選項在 PR 觸發構建時,會根據 PR 衝突狀況選擇是否進行構建。

  4. Allowed branches 能夠配置容許構建的分支,目前支持分支名和正則表達式的方式進行過濾。

  5. Secret Token for Gitee WebHook 該選項能夠配置 WebHook 的密碼,該密碼須要與Gitee WebHook配置的密碼一致方可觸發構建。

  6. 注意:若 PR 狀態爲不可自動合併,則不觸發構建。 觸發器配置

6. 構建後步驟配置

前往任務配置的構建後配置: Configure -> Post-build Actions 選項卡

7. 構建結果回評至Gitee
  1. 點擊 Add post-build action 下拉框選擇:Add note with build status on Gitee pull requests

  2. Advanced 中能夠配置:

    • Add message only for failed builds :僅爲構建失敗回評到Gitee

    • 自定義各狀態的回評內容(內容能夠引用 Jenkins 的環境變量,或者自定義的環境變量)

  3. 若開啓該功能,還可將不可自動合併的狀態回評至Gitee

8. 構建成功自動合併PR

點擊 Add post-build action 下拉框選擇:Accept Gitee pull request on success

構建後步驟配置

9. 新建Gitee項目WebHook

進入源碼管理配置中設置的Gitee項目中,進入 管理 -> WebHooks

  1. 添加 WebHook, URL 填寫 觸發器配置:Build when a change is pushed to Gitee. Gitee webhook URL 中所示 URL,如:: http://127.0.0.1:8080/jenkins/project/fu

  2. 密碼填寫:觸發器配置第 5 點中配置的 WebHook密碼,不設密碼能夠不填

  3. 勾選 PUSH, Pull Request

10. 測試推送觸發構建
  1. Gitee的 WebHook 管理中選擇勾選了PUSH的 WebHook 點擊測試,觀察 Jenkins 任務的構建狀態

  2. Gitee項目頁面編輯一個文件提交,觀察 Jenkins 任務的構建狀態

11. 測試PR觸發構建
  1. Gitee的 WebHook 管理中選擇勾選了 Pull Request 的 WebHook 點擊測試,觀察 Jenkins 任務的構建狀態

  2. 在Gitee項目中新建一個Pull Request,觀察 Jenkins 任務的構建狀態

(四)環境變量

目前支持環境變量見如下函數,其中不一樣的 WebHook 觸發可能致使有些變量爲空,具體請安裝插件 EnvInject Plugin,於構建中查看 Environment Variables

    public Map<String, String> getBuildVariables() {
      MapWrapper<String, String> variables = new MapWrapper<>(new HashMap<String, String>());
      variables.put("giteeBranch", branch);
      variables.put("giteeSourceBranch", sourceBranch);
      variables.put("giteeActionType", actionType.name());
      variables.put("giteeUserName", userName);
      variables.put("giteeUserEmail", userEmail);
      variables.put("giteeSourceRepoHomepage", sourceRepoHomepage);
      variables.put("giteeSourceRepoName", sourceRepoName);
      variables.put("giteeSourceNamespace", sourceNamespace);
      variables.put("giteeSourceRepoURL", sourceRepoUrl);
      variables.put("giteeSourceRepoSshUrl", sourceRepoSshUrl);
      variables.put("giteeSourceRepoHttpUrl", sourceRepoHttpUrl);
      variables.put("giteePullRequestTitle", pullRequestTitle);
      variables.put("giteePullRequestDescription", pullRequestDescription);
      variables.put("giteePullRequestId", pullRequestId == null ? "" : pullRequestId.toString());
      variables.put("giteePullRequestIid", pullRequestIid == null ? "" : pullRequestIid.toString());
      variables.put("giteePullRequestTargetProjectId", pullRequestTargetProjectId == null ? "" : pullRequestTargetProjectId.toString());
      variables.put("giteePullRequestLastCommit", lastCommit);
      variables.put("giteePushCreated", created ? "true" : "false");
      variables.put("giteePushDeleted", deleted ? "true" : "false");
      variables.putIfNotNull("giteePullRequestState", pullRequestState);
      variables.putIfNotNull("giteeMergedByUser", mergedByUser);
      variables.putIfNotNull("giteePullRequestAssignee", pullRequestAssignee);
      variables.put("giteeTargetBranch", targetBranch);
      variables.put("giteeTargetRepoName", targetRepoName);
      variables.put("giteeTargetNamespace", targetNamespace);
      variables.put("giteeTargetRepoSshUrl", targetRepoSshUrl);
      variables.put("giteeTargetRepoHttpUrl", targetRepoHttpUrl);
      variables.put("giteeBefore", before);
      variables.put("giteeAfter", after);
      variables.put("giteeBeforeCommitSha", before);
      variables.put("giteeAfterCommitSha", after);
      variables.put("giteeRef", ref);
      variables.put("ref", ref);
      variables.put("beforeSha", beforeSha);
      variables.put("isTag", isTag);
      variables.put("sha", sha);
      variables.put("status", status);
      variables.put("stages", stages);
      variables.put("createdAt", createdAt);
      variables.put("finishedAt", finishedAt);
      variables.put("duration", buildDuration);
      variables.put("jsonBody", jsonBody);
      variables.put("noteBody", noteBody);
      variables.putIfNotNull("giteeTriggerPhrase", triggerPhrase);
      return variables;
  }

(五)打包或運行測試

打包 hpi 文件在倉庫目錄中執行: mvn package

直接運行測試執行:mvn hpi:run

 

第三部分:jenkins構建APIAutomation項目

1.基礎環境配置

  • 安裝allure-report插件

  • JDK配置

    參考上一章jenkins關聯jmeter自動化部署教程

  • git配置

    參考上一章jenkins關聯jmeter自動化部署教程

  • allure配置

    Manage Jenkisn -> 全局工具配置 ,配置以下圖所示

    image.png

     

  • gitee配置

    1. Manage Jenkins -> 系統配置,配置以下圖所示

      image.png

    2. 配置全局憑證:選擇Gitee API令牌

      image.png

    3. Gitee API 令牌生成,登陸gitee ->設置->私人令牌->生成

       

       

       

    4. 將如上生成的令牌粘貼進入測試以下所示成功

      image.png

       

       

     

  • 全局屬性配置

    Manage Jenkins -> 系統配置->全局屬性,配置以下圖所示

    image.png

  • 字符編碼配置

    1. Manage Jenkins -> 系統配置->全局屬性

      image.png

    2. Mange Jenkins -> Manage Nodes and Clouds

      image.png 

    3. 配置jenkins 啓動文件

      添加以下內容:

      -Dhudson.model.DirectoryBrowserSupport.CSP= -Dfile.encoding=UTF-8 -Dsun.jnu.encoding=UTF-8

      copy.png

       

    4. 配置服務器環境變量

      設置jenkins所在服務器環境變量,右鍵個人電腦→屬性→高級系統設置→環境變量,添加JAVA_TOOL_OPTIONS

      image.png

    5. CMD配置

      chcp 65001

      在命令行標題欄上點擊右鍵,選擇"屬性"->"字體",將字體修改成True Type字體"Lucida Console"

 

2. 構建項目

源碼管理

image.png

配置憑證

image.png

全部配置的憑證在首頁都可查看

image.png

構建觸發器

image-20210312131627890

 

 

生成的webhook鉤子程序複製生成的密碼粘貼到Gitee 項目 ->管理 ->

image.png

image.png

構建

image-20210312132854385

 

 

 

PATH=$PATH;D:\user\local\Python\Python38-32\Scripts
PATH=$PATH;D:\user\local\Python\Python38-32\Scripts
xcopy /y /c /h /r /s APIAutomatormation D:\user\workspace\py_workspace\APIAutomatormation\
cd /d D:/user/workspace/py_workspace/APIAutomatormation
pytest -s -q --alluredir result
rem D:\user\local\allure-2.13.8\bin\allure.bat generate   result -o report --clean
rem xcopy /y/c/h/r/s report C:\Windows\System32\config\systemprofile\AppData\Local\Jenkins\.jenkins\workspace\APIAutomatormation\report
exit 0

構建後操做:添加Allure報告

image-20210312133034580

 

 

 

 

 

第三部分:jenkins構建APIAutomation項目點擊高級

image.png

構建後操做:郵件通知

image.png

image.png

郵件模板完整內容:

image.png

image.png

成功填寫完成,build無誤後 jenkins上會看到以下結果:

image.png

郵件成功通知:

image.png

郵件模板完整內容以下:

<!DOCTYPE html>
<html lang="en">
<body leftmargin="8" marginwidth="0" topmargin="8" marginheight="4" offset="0">
  <table width="95%" cellpadding="0" cellspacing="0" style="font-size: 11pt; font-family: Tahoma, Arial, Helvetica, sans-serif">
      <tr>
            測試郵件,無需回覆!<br/>
            各位同事,你們好,如下爲${PROJECT_NAME }項目構建信息</br>
            <h4><font color="red">allure報告在線查看or下載allure-report.zip用firefox離線查看,測試用例見附件</font></h4>
            <h2>在線圖表測試報告:<br/>
            <a HREF="${PROJECT_URL}${BUILD_NUMBER}/allure">${PROJECT_URL}${BUILD_NUMBER}/allure</a><h2>
           
      </tr>
      <tr>
          <td><br/>
          <b><font color="#0B610B">項目描述:${JOB_DESCRIPTION}<br></font></b>
          <hr size="2" width="100%" align="center" /></td>
      </tr>
      <tr>
          <td>
              <ul>
                  <li>項目名稱 : ${PROJECT_NAME}</li>
                  <li>構建編號 : 第${BUILD_NUMBER}次構建</li>
                  <li>SVN 版本: ${SVN_REVISION}</li>
                  <li>觸發緣由: ${CAUSE}</li>
                  <li>構建狀態: ${BUILD_STATUS}</li>
                  <li>構建日誌: <a href="${BUILD_URL}console">${BUILD_URL}console</a></li>
                  <li>構建 Url : <a href="${BUILD_URL}">${BUILD_URL}</a></li>
                  <li>工做目錄 : <a href="${PROJECT_URL}ws">${PROJECT_URL}ws</a></li>
                  <li>項目 Url : <a href="${PROJECT_URL}">${PROJECT_URL}</a></li>
                  <li>系統allure測試報告:<a HREF="${PROJECT_URL}${BUILD_NUMBER}/allure">${PROJECT_URL}${BUILD_NUMBER}/allure</a><li>
              </ul>
    </td>
      <tr>
         <td>
          <b><font color="#0B610B">構建日誌 (最後 100行):</font></b>
       <hr size="2" width="100%" align="center" />
          </td>
      </tr>
      <tr>
          <td>
              <textarea cols="80" rows="30" readonly="readonly" style="font-family: Courier New">${BUILD_LOG, maxLines=100}</textarea>
          </td>
      </tr>
      ${JELLY_SCRIPT}
  </table>
</body>
</html>

第四部分:採坑記錄

一. 本地測試經過,上傳代碼等到gitee服務器運行到jenkins主機,出現以下目錄or路徑不存在

image.png

本地排查思路:

  1. 看到有 unucodeescape 錯誤,開始覺得亂碼致使,而後在每一個文件頭加字符編碼配置# _*_ coding:utf-8 _*_ 以後發現不可用

  2. 看到提示No such file or directory :在本機排查發現該文件在當前目錄存在,可是就是爲什麼找不到,懷疑是sys.path沒有將當前項目路徑添加到 PYTHONPATH當中,修改代碼以下:

     execFilePath = os.path.dirname(__file__) + '/testcase'
      # 追加logging
      # D:\user\workspace\py_workspace\APIAutomationFramework\testcase
      # execfile = execFilePath + '/test_API.py'
       
      # execfile = r'D:/user/workspace/py_workspace/APIAutomationFramework/testcase/test_API.py'
      #此處修改成絕對路徑
      execfile = os.path.join(os.path.abspath(os.path.dirname(__file__)), 'testcase', 'test_API.py')
      python_install_cmd = os.path.join(sys.path[10], 'python.exe')
      os.system("python " + execfile)

    以後發現仍然不可用,

    1. 定位代碼logUtils類, 懷疑該行代碼有問題

    image.png

    查看對應的源碼解析,排查到 **os.path.dirname(__file__)**引用相對路徑的問題,查詢結果以下

    python3 獲取當前路徑及os.path.dirname的使用

    方法一:

    import sys,os
    os.getcwd()#而後就能夠看見結果了

    方法二:

    import os
    os.path.dirname(os.path.realpath('__file__'))#注意:添加單引號

    python中的os.path.dirname(file)的使用

    (1)當"print os.path.dirname(file)"所在腳本是以完整路徑被運行的, 那麼將輸出該腳本所在的完整路徑,好比:

    python d:/pythonSrc/test/test.py

    那麼將輸出 d:/pythonSrc/test

    (2)當"print os.path.dirname(file)"所在腳本是以相對路徑被運行的, 那麼將輸出空目錄,好比:

    python test.py

    那麼將輸出空字符串

    python中的os.path.dirname(path)

    語法:os.path.dirname(path) 功能:去掉文件名,返回目錄 如:

    print(os.path.dirname('W:\Python_File\juan之購物車.py'))
    #結果
    #W:\Python_File
    print(os.path.dirname('W:\Python_File'))
    #結果
    #W:\

    參考博客:http://www.javashuo.com/article/p-fxxgkyic-vg.html

    而後並無卵用, 再次排查

    1. 定位到多是否因爲fileConfig(p) 加載參數配置只能以windows環境下「\」 標識,查閱相關資料以下

    首先,"/"左傾斜是正斜槓,""右傾斜是反斜槓,能夠記爲:除號是正斜槓通常來講對於目錄分隔符,Unix和Web用正斜槓/,Windows用反斜槓,可是如今Windows 不限制,均可使用

    (一)目錄中的斜槓們

    python讀文件須要輸入的目錄參數,列出如下例子:

    path = r"C:\Windows\temp\readme.txt"

    path1 = r"c:\windows\temp\readme.txt"

    path2 = "c:\windows\temp\readme.txt"

    path3 = "c:/windows/temp/readme.txt"

    打開文件函數open()中的參數能夠是path也能夠是path一、path二、path3。

     

    path:""爲字符串中的特殊字符,加上r後變爲原始字符串,則不會對字符串中的"\t"、"\r" 進行字符串轉義

    path1:大小寫不影響windows定位到文件

    path2:用一個""取消第二個""的特殊轉義做用,即爲"\"

    path3:用正斜槓作目錄分隔符也能夠轉到對應目錄,而且在python中path3的方式也省去了反斜槓\轉義的煩惱

    (二)正則表達式中的斜槓們

    正則表達式匹配反斜槓"",爲何是"\\"或是 r"\"呢?

    由於在正則表達式中\爲特殊符號,爲了取消它在正則表達式中的特殊意義須要加一個\就變成了\,可是問題又來了,\也是字符串中的特殊字符,因此又要分別對兩個\取消其特殊意義,即爲\\。Python中有一個原始字符串操做符,用於那些字符串中出現特殊字符,在原始字符串中,沒有轉義字符和不能打印的字符。這樣就能夠取消了\在字符串中的轉義功能,即r"\"。

    然而仍然沒有卵用 ,

    1. 最後排查到最後一行代碼:

    定位該行問題發現,該文件只有配置文件引用,在logging.conf 下

    的確因爲該路徑被找不到,目前很疑惑根本緣由暫未找到一樣是windows操做環境,換臺機器就沒法操做,很讓人疑惑,總之更改成項目路徑好使

 

二. 本地測試,生成的報告單獨在桌面直接用index打開數據沒法加載,可是在IDE裏能夠

顯示以下狀況:

處於loading狀態,說明有數據只是無法加載出來

問題解決

  • 其實在allure-report下index.html文件是不能直接打開的,出現頁面都是loading的狀況,這是由於直接allure報告用瀏覽器是打不開的,須要用allure命令渲染以後打開才能展現效果(allure常識)。

  • allure使用了兩種方式來渲染頁面。分別是 allure open 和 allure serve。前者用於在本地渲染和查看結果,後者用於在本地渲染後對外展現結果。這裏咱們使用allure open。運行命令

     

allure open allure-report目錄

便可自動打開瀏覽器展現渲染好的結果。這裏的allure-report爲allure generate生成的結果所在目錄。

三. 集成到jenkins上發現結果無數據

這裏有兩兩種場景:1. 一種是無數據 2. 一種是有數據只不過處於loading狀態加載不出來

目前處於第1種結果:具體表現形式以下:

排查可能緣由:

  1. 首先明確 pytest生成的數據默認在allure-result目錄下,這裏我更改了result目錄,經過本地的IDE和cmd命令行發現沒有問題,那麼只能是jenkins windows Execute shell命令行有問題

    命令行內容以下

    xcopy  /y /c /h /r /s  APIAutomatormation  D:\user\workspace\py_workspace\APIAutomatormation\
    cd /d D:/user/workspace/py_workspace/APIAutomatormation
    python run_main.py
    exit 0

    以後發現,是壓根''python run_main.py '' 壓根就沒有執行,估計是jenkins內部沒有識別python變量,手工添加python執行路徑:

    $PYTHON_PATH\python.exe run_main.py

    發現執行到一半又不能執行了:

    定位到以下位置:

    發現代碼裏又引用了相對路徑,再次添加絕對路徑進行執行該命令,console控制亂碼錯誤顯示以下:

    估計問題不在這裏,再次查詢Google, 查到原來jenkins集成allure執行的時候是不須要手工執行生成報告的,查看會自動幫你作

  2. 再次更改執行命令以下:

    PATH=$PATH;D:\user\local\Python\Python38-32\Scripts
    PATH=$PATH;D:\user\local\Python\Python38-32\Scripts
    xcopy /y /c /h /r /s APIAutomatormation D:\user\workspace\py_workspace\APIAutomatormation\
    cd /d D:/user/workspace/py_workspace/APIAutomatormation
    pytest -s -q --alluredir result
    D:\user\local\allure-2.13.8\bin\allure.bat generate   result -o report --clean
    exit 0

    運行以後發現仍然沒有數據,而且pytest -s -q --alluredir result 這行命令彷佛沒有執行 ,發現pytest找不到該命令,實際path已經配置了python環境變量 , 手工將pytest所在目錄也添加到path環境變量中,顯示以下:

  3. 終於pytest能夠執行了,可是report沒有結果數據,查看jenkins console發現 取的report是工做空間目錄的結果report數據 , 因而手工複製生成的報告拷貝到jenkins工做空間當中

    命令行變爲以下

    xcopy  /y /c /h /r /s  APIAutomatormation/report  C:\Windows\System32\config\systemprofile\AppData\Local\Jenkins\.jenkins\workspace\APIAutomatormation\report

    然而很坑爹並無卵用

  4. 再次查看result路徑,發現其實生成了 result是有數據的,只不過沒有體如今report裏,原來jenkins 不用你手工生成報告,插件會自動幫你生成,最後一步取消 ;完整結果顯示以下:

    PATH=$PATH;D:\user\local\Python\Python38-32\Scripts
    PATH=$PATH;D:\user\local\Python\Python38-32\Scripts
    xcopy /y /c /h /r /s APIAutomatormation D:\user\workspace\py_workspace\APIAutomatormation\
    cd /d D:/user/workspace/py_workspace/APIAutomatormation
    pytest -s -q --alluredir result
    exit 0

    完美解決

    最後構建後操做生成報告的地方必定要注意 result 和 report填寫路徑要正確,不然數據仍然不會展現的

 

至此,該篇幅文章講解結束,以上都是博主親自在公司實踐記錄的內容,若有描述錯誤的地方還請留言批評指出。

相關文章
相關標籤/搜索