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


 

 

 

前言

本次集成示意圖

image.png

解釋:

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

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

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

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

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

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

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

  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:\

    參考博客:https://www.cnblogs.com/yuehouse/p/12028368.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也可以是path1、path2、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填寫路徑要正確,否則數據仍然不會展示的

 

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

 


免責聲明!

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



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