高顏值測試報告- XTestRunner

蟲師發表於2022-03-15

Modern style test report based on unittest framework.

基於unittest框架現代風格測試報告。

特點

  • 漂亮測試報告讓你更願意編寫測試。
  • 支援單元Web UIAPI 各種型別的測試。
  • 支援Selenium執行失敗/錯誤自動截圖。
  • 支援失敗重跑。
  • 支援標籤黑、白名單。
  • 支援發郵件功能。
  • 支援多語言enzh-CN 等。
  • 支援HTML/XML不同格式的報告。

安裝

  • pip安裝
> pip install XTestRunner

使用文件

單元測試

XTestRunner基本用法,用於生成 HTML測試報告。

測試用例

# test_unit.py
import unittest
from XTestRunner import HTMLTestRunner


class TestDemo(unittest.TestCase):
    """測試用例說明"""
    
    def test_success(self):
        """執行成功"""
        self.assertEqual(2 + 3, 5)
    
    @unittest.skip("skip case")
    def test_skip(self):
        """跳過用例"""
        pass
    
    def test_fail(self):
        """失敗用例"""
        self.assertEqual(5, 6)
    
    def test_error(self):
        """錯誤用例"""
        self.assertEqual(a, 6)

if __name__ == '__main__':
    suit = unittest.TestSuite()
    suit.addTests([
        TestDemo("test_success"),
        TestDemo("test_skip"),
        TestDemo("test_fail"),
        TestDemo("test_error")
    ])
    
    with(open('./result.html', 'wb')) as fp:
        runner = HTMLTestRunner(
            stream=fp,
            title='<project name>test report',
            description='describe: ... ',
            language='en',
        )
        runner.run(
            testlist=suit,
            rerun=2,
            save_last_run=False
        )

HTMLTestRunner類說明

  • stream: 指定報告的路徑。
  • title: 報告的標題。
  • description: 報告的描述, 支援strlist兩種型別。
  • language: 支援中文zh-CN, 預設en

run()方法說明

  • testlist: 執行的測試套件。
  • rerun: 重跑次數。
  • save_last_run: 是否儲存最後一個重跑結果。

執行測試

> python test_unit.py

Selenium Web測試

針對Selenium Web自動化測試提供了失敗/錯誤 自動截圖功能。

注意

1.安裝selenium

> pip install selenium

2.注意:驅動必須定義為 driver, 否則無法生成截圖。

測試用例

import unittest
from XTestRunner import HTMLTestRunner
from selenium import webdriver
from selenium.webdriver.common.by import By


class SeTest(unittest.TestCase):

    @classmethod
    def setUpClass(cls) -> None:
        cls.driver = webdriver.Chrome()
        cls.base_url = "https://cn.bing.com/"

    @classmethod
    def tearDownClass(cls) -> None:
        cls.driver.quit()

    def test_success(self):
        """測試bing搜尋:XTestRunner """
        self.driver.get(self.base_url)
        search = self.driver.find_element(By.ID, "sb_form_q")
        search.send_keys("XTestRunner")
        search.submit()

    def test_error(self):
        """測試bing搜尋,定位失敗 """
        self.driver.get(self.base_url)
        self.driver.find_element(By.ID, "sb_form_qxxx").send_keys("python")

    def test_fail(self):
        """測試bing搜尋,斷言失敗 """
        self.driver.get(self.base_url)
        self.driver.find_element(By.ID, "sb_form_q").send_keys("unittest")
        self.assertEqual(self.driver.title, "unittest")

    def test_screenshots(self):
        """測試截圖"""
        self.driver.get(self.base_url)
        # 元素截圖
        elem = self.driver.find_element(By.ID, "sb_form_q")
        self.images.append(elem.screenshot_as_base64)
        # 豎屏截圖
        self.images.append(self.driver.get_screenshot_as_base64())
        # 最大化截圖
        self.driver.maximize_window()
        self.images.append(self.driver.get_screenshot_as_base64())


if __name__ == '__main__':
    report = "./selenium_result.html"
    with(open(report, 'wb')) as fp:
         unittest.main(testRunner=HTMLTestRunner(
            stream=fp,
            title='Selenium自動化測試報告',
            description=['型別:selenium', '作業系統:Windows', '瀏覽器:Chrome', '執行人:蟲師']
        ))

測試報告

一個用例支援多張截圖,不同的截圖自動輪播,而且優化之後,不管是頁面元素截圖,橫向、縱向圖片都可以很好的展示。

API 介面測試

XTestRunner 當然也支援HTTP介面測試了。

  • 安裝requests
> pip install requests

測試用例

import requests
import unittest
from XTestRunner import HTMLTestRunner

class YouTest(unittest.TestCase):

    def test_get(self):
        """測試get介面 """
        r = requests.get("https://httpbin.org/get", params={"key":"value"})
        print(r.json())

    def test_post(self):
        """測試post介面 """
        r = requests.post("https://httpbin.org/post", data={"key":"value"})
        print(r.json())

    def test_put(self):
        """測試put介面 """
        r = requests.put("https://httpbin.org/put", data={"key":"value"})
        print(r.json())

    def test_delete(self):
        """測試delete介面 """
        r = requests.delete("https://httpbin.org/delete", data={"key":"value"})
        print(r.json())


if __name__ == '__main__':
    report = "./reports/api_result.html"
    with(open(report, 'wb')) as fp:
        unittest.main(testRunner=HTMLTestRunner(
            stream=fp,
            title='Seldom自動化測試報告',
            description=['型別:API', '地址:https://httpbin.org/', '執行人:蟲師']
        ))

測試報告

通過print() 可以講介面資訊列印到報告中展示。

郵件功能

XTestRunner 支援郵件功能。

import unittest
from XTestRunner import HTMLTestRunner
from XTestRunner import SMTP
...

if __name__ == '__main__':
    report = "./reports/send_email_result.html"
    with(open(report, 'wb')) as fp:
        unittest.main(testRunner=HTMLTestRunner(
            stream=fp,
            title='測試傳送郵件',
            description=['型別:測試傳送郵件', '執行人:蟲師']
        ))
    # 發郵件功能
    # 使用126郵箱傳送時password應為授權碼而非使用者密碼,須在郵箱客戶端設定開啟授權碼
    # 使用gmail郵箱傳送時password為使用者密碼,須在gmail客戶端開啟安全性較低的應用的訪問許可權
    smtp = SMTP(user="sender@qq.com", password="xxx", host="smtp.qq.com")
    smtp.sender(to="fnngj@126.com", subject="XTestRunner測試郵件", attachments=report)

郵件展示

支援黑白名單

可以通過黑白名單選擇要執行(或跳過)的用例。

  • 支援白黑名單
    • 白名單:whitelist=["base"] 只有使用@label("base")裝飾的用例執行
    • 黑名單:blacklist=["slow"] 只有使用@label("slow")裝飾的用例不被執行

測試用例

import unittest
from XTestRunner import label
from XTestRunner import HTMLTestRunner


class LabelTest(unittest.TestCase):

    @label("base")
    def test_label_base(self):
        self.assertEqual(1+1, 2)

    @label("slow")
    def test_label_slow(self):
        self.assertEqual(1, 2)

    def test_no_label(self):
        self.assertEqual(2+3, 5)


if __name__ == '__main__':
    report = './reports/label_result.html'
    with(open(report, 'wb')) as fp:
        unittest.main(testRunner=HTMLTestRunner(
            stream=fp,
            title='<project name>test report',
            description='describe: ... ',
            whitelist=["base"],  # 設定白名單
            # blacklist=["slow"],  # 設定黑名單
        ))

注意:

白名單和黑名單不要同時用,以免產生衝突。

XML格式報告

雖然,HTML報告的顏值很高,但有時需要提取測試資料,比如儲存到資料庫,這個時候從HTML報告中提取資料是非常麻煩的,所以,XTestRunner 支援XML格式的報告。

import unittest
from XTestRunner import XMLTestRunner

#...

if __name__ == '__main__':
    # 定義報告
    report = "./xml_result.xml"
    with(open(report, 'wb')) as fp:
        unittest.main(testRunner=XMLTestRunner(output=fp))

報告展示

相關文章