1. 程式人生 > >移動自動化appium(2)- Allure報告使用詳解

移動自動化appium(2)- Allure報告使用詳解

6 Allure報告

6.1 Allure介紹

Allure是一個獨立的報告外掛,生成美觀易讀的報告,比之前的html好看,目前支援的語言:Java、PHP、Ruby、Python、C#等

6.2 Allure安裝

pip3 install allure-pytest

(注意:這裡不要使用pytest-allure-adaptor)

有一個幫助文件可以參考:

https://docs.qameta.io/allure/#_about

生成Allure報告的命令:

pytest --alluredir report

執行完這條命令,case執行完畢後,會在當前目錄下生成一個report資料夾,裡面有一個json檔案,就是生成的報告

 

在pytest.ini中,之前的報告是這樣生成的:

addopts = -s --html=report/report.html --reruns 1

如果想用allure,那麼改成:

addopts = -s --alluredir report --reruns 1

直接在終端執行pytest就可以了

6.3 json報告轉為html報告

上面的命令執行後,生成的是json檔案,json檔案不那麼好看,需要將json轉成html,這裡要先安裝一個外掛,步驟:

1、下載allure壓縮包,地址:

https://dl.bintray.com/qameta/generic/io/qameta/allure/allure/2.7.0/allure-2.7.0.zip

2、解壓後,將bin目錄配置到環境變數

3、進入report的上一級目錄,執行命令:allure generate report/ -o report/html --clean

執行上面的操作步驟後,在report資料夾下就多了一個html資料夾,裡面的index.html檔案就是html報告。

 

生成html的時候遇到這樣的報錯:

Exception in thread "main" java.lang.UnsupportedClassVersionError: io/qameta/all

ure/CommandLine : Unsupported major.minor version 52.0

那麼可能是你的jdk版本太低了,可以開啟cmd,輸入java -version,以及javac -version,看一下版本,如果低於1.8,換成1.8版本就好了。

jdk1.8版本下載地址:

https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html

 

6.4 allure+pytest實戰操作

6.4.1 step用法

@allure.step(“”):

用來描述用例步驟的,簡單一點的用法,比如新建一個專案,框架如圖:

 

第一種用法:

在”F:\python\allureDemo\scripts\test_demo.py”檔案中,寫入下列程式碼:

import allure


class TestLogin:

    @allure.step("測試登入成功的步驟")

    def test_login_success(self):

        print("login success")

        assert 1

在終端輸入pytest執行測試用例,然後從cmd進入到F:\python\allureDemo這個路徑,輸入allure generate report/ -o report/html --clean,生成測試報告

觀察報告結果:

開啟生成的報告,點選左側的“包”或者“功能”,可以看到這樣的頁面,右側test_login_success是我們的測試用例,圈綠色的部分是step的內容。

 

第二種用法:

allure的幫助文件中,給出的step的示例,test_steps_with_placeholders()這個測試用例:

import allure


@allure.step('Step with placeholders in the title, positional: "{0}", keyword: "{key}"')

def step_with_title_placeholders(arg1, key=None):

    pass

def test_steps_with_placeholders():

    step_with_title_placeholders(1, key='something')

    step_with_title_placeholders(2)

    step_with_title_placeholders(3, 'anything')

執行結果:

 

第三種用法:

第三種用法是隻寫一個@allure.step,沒有引數,這種情況會直接把方法名放到步驟顯示的位置,例如:

  @allure.step

    def test_login_fail1(self):

        print("login fail1")

        assert 0

執行結果:

 

 

 

還有比如:

@allure.step
def passing_step(): pass def test_with_step_in_fixture_from_conftest(fixture_with_conftest_step):   passing_step()

等等方式

6.4.2 attach()新增case描述和截圖

allure.attach()不是一個裝飾器,需要寫到test用例裡面,比如下面這樣:

    def test_login_fail(self):

        allure.attach("輸入正確的使用者名稱:xxxx")

        print("input username")

        allure.attach("", "輸入錯誤的密碼:xxx")

        print("input password")

        allure.attach("", "點選登入")

        print("click login button")

        assert 0

第二個attach方法有兩個引數,第一個有一個,這樣寫雖然都不會報錯,但是結果會不一樣,如圖:

 

第一個,只寫了一個引數的,會像圖第一個圈紅的位置那樣,必須點開這個才會看到操作步驟,第二個和第三個,直接就可以看到操作步驟,更直觀。

 

attach還可以增加截圖:

    def test_login_success(self):

        allure.attach.file(r'D:\xx\xxx.jpg', '我是附件截圖的名字',

                           attachment_type=allure.attachment_type.JPG)

        print("login success")

        assert 1

結果:

 

點選截圖的名字,就可以看到截圖。

attach.file()第三個引數,還可以是allure.attachment_type.PNG、allure.attachment_type.HTML、allure.attachment_type.TEXT等。

 

6.4.3 Descriptions

  description是顯示在描述位置的內容,可以描述一下你這個測試用例想做什麼。

 

第一種用法,長字串:

@allure.description("""

Multiline test description.

That comes from the allure.description decorator.

Nothing special about it.

""")

def test_description_from_decorator():

  assert 42 == int(6 * 7)

結果:

 

第二種用法,html格式:

可以使用html格式

 

import allure

@allure.description_html("""
<h1>Test with some complicated html description</h1>
<table style="width:100%">
  <tr>
    <th>Firstname</th>
    <th>Lastname</th>
    <th>Age</th>
  </tr>
  <tr align="center">
    <td>William</td>
    <td>Smith</td>
    <td>50</td>
  </tr>
  <tr align="center">
    <td>Vasya</td>
    <td>Jackson</td>
    <td>94</td>
  </tr>
</table>
""")
def test_html_description():
  assert True

結果:

 

這裡如果我們只是想要用一兩句話概括這個測試用例的話,直接用一個字串就足夠了。

 

第三種用法,文件註釋:

def test_unicode_in_docstring_description():

    """Unicode in description.

    Этот тест проверяет юникод.

    你好夥計.

    """

    assert 42 == int(6 * 7)

像這樣的文件註釋,會直接放到報告的描述中去,如圖:

 

6.4.4 title用法

  title就是顯示的case標題

比如這樣:

    @allure.title("case1:登入成功的用例")

    def test_login_success(self):

        allure.attach.file(r'D:\一寸照\報名照片.jpg', '我是附件截圖的名字',

                           attachment_type=allure.attachment_type.JPG)

        print("login success")

        assert 1

 

結果如圖:

 

會在圈紅部分兩個地方顯示。

如果有引數的話,還可以這樣用:

import allure
import pytest

@allure.title("Parameterized test title: adding {param1} with {param2}")
@pytest.mark.parametrize('param1,param2,expected', [
    (2, 2, 4),
    (1, 2, 5)
])

def test_with_parameterized_title(param1, param2, expected):
    assert param1 + param2 == expected

結果就是這樣:

 

6.4.5 link超連結

 

直接把官網的例子拿過來:

import allure

TEST_CASE_LINK = 'https://github.com/qameta/allure-integrations/issues/8#issuecomment-268313637'


@allure.link('https://www.youtube.com/watch?v=4YYzUTYZRMU')
def test_with_link():
    pass


@allure.link('https://www.youtube.com/watch?v=Su5p2TqZxKU', name='Click me')
def test_with_named_link():
    pass


@allure.issue('140', 'Pytest-flaky test retries shows like test steps')
def test_with_issue_link():
    pass


@allure.testcase(TEST_CASE_LINK, 'Test case title')
def test_with_testcase_link():
    pass

執行後,會出來一個連結,可以點選。

6.4.6 用例級別

下面這段程式碼示例裡有兩個點,一個是feature方法,一個是severity

import allure


@allure.feature('這裡是一級標籤')
class TestLogin:
    @allure.title("case1:登入成功的用例")
    @allure.description("這裡是對test_login_success用例的一些詳細說明")
    @allure.story("這裡是第一個二級標籤")
    def test_login_success(self):
        allure.attach.file(r'D:\一寸照\報名照片.jpg', '我是附件截圖的名字',
                           attachment_type=allure.attachment_type.JPG)
        print("login success")
        assert 1

    @allure.title("case2:登入失敗的用例")
    @allure.description("這裡是對test_login_fail用例的一些詳細說明")
    @allure.severity(allure.severity_level.CRITICAL)
    @allure.story("這裡是第一個二級標籤")
    def test_login_fail(self):
        allure.attach("步驟1", "輸入正確的使用者名稱")
        print("input username")
        allure.attach("步驟2", "輸入錯誤的密碼")
        print("input password")
        allure.attach("步驟3", "點選登入")
        print("click login button")
        assert 0

    @allure.title("case3:登入失敗的用例")
    @allure.description("這裡是對test_login_fail1用例的一些詳細說明")
    @allure.severity(allure.severity_level.BLOCKER)
    @allure.story("這裡是第一個二級標籤")
    def test_login_fail1(self):
        print("login fail1")
        assert 0

點選allure報告中的“圖表”,可以看到有優先順序:

 

這個優先順序,如果不寫,預設就是normal。用法就像標黃色底色那樣,級別總共有五個:

  • BLOCKER = 'blocker'  中斷缺陷(客服端程式無響應,無法執行下一步驟)
  • CRITICAL = 'critical'  臨界缺陷(功能點缺失)
  • NORMAL = 'normal'  普通缺陷(資料計算錯誤)
  • MINOR = 'minor'  次要缺陷(介面錯誤與ui需求不符)
  • TRIVIAL = 'trivial'  輕微缺陷(必須項無提示,或者提示不規範) 

 

用例分級的方法:

@allure.feature('這裡是一級標籤')

@allure.story("這裡是第一個二級標籤")

 

對應的結果為:

 

6.4.7 新增截圖

3.7.6講到過截圖的方法get_screenshot_as_file(路徑),6.4.2講了attach上傳圖片的方法,兩個方法結合起來就可以在測試過程中截圖並且傳到報告上

    def test_login(self):
        # 輸入手機號
        self.login_page.input_tel("1851062653")
        # 輸入密碼
        self.login_page.input_pwd("sy123")
        time.sleep(3)     
        # 點選登入
        self.login_page.click_login()
        # 截圖的方法
        self.login_page.screenshot("login_success")
        # 上傳到報告
        allure.attach.file(r'.\screen\login_success.png', 'login_success',\
                           attachment_type=allure.attachment_type.PNG)

    def screenshot(self, file_name):
        self.driver.get_screenshot_as_file("./screen/" + file_name + ".png")