­

Pytest常用插件之HTML報告(十二)

  • 2020 年 1 月 27 日
  • 筆記

在Pytest的測試框架中,有很豐富的插件,還是接著之前的案例繼續延伸來說這部分,今天主要介紹基於Pytest測試框架的測試報告部分,其實在Pytest測試框架裡面,測試報告可以使用html的插件,也可以使用allure來生成測試報告,關於allure在使用會在下一個文章中詳細的介紹它的使用。

首先來安裝基於HTML測試報告的插件,插件名稱為pytest-html,安裝的命令為:pip3 install pytest-html,安裝成功後,就會顯示如下的資訊:

Installing collected packages: pytest-html  Successfully installed pytest-html-2.0.1

編寫測試案例,以測試常用的網站為案例,具體使用的測試源碼如下:

#!/usr/bin/python3  #coding:utf-8  import  pytest  import  yaml  import  os  import  requests  import  json      class Request:     def request(self,url,method='get',**kwargs):        if method=='get':           return requests.request(url=url,method=method,**kwargs)        elif method=='post':           return requests.request(url=url,method=method,**kwargs)        elif method=='put':           return requests.request(url=url,method=method,**kwargs)        elif method=='delete':           return requests.request(url=url,method=method,**kwargs)       def get(self,url,**kwargs):        return self.request(url=url,method='get',**kwargs)       def post(self,url,**kwargs):        return self.request(url=url,method='post',**kwargs)       def put(self,url,**kwargs):        return self.request(url=url,method='put',**kwargs)       def delete(self,url,**kwargs):        return self.request(url=url,method='delete',**kwargs)      def readYaml():     with  open('books.yaml','r')  as f:        return list(yaml.safe_load_all(f))    @pytest.mark.parametrize('datas',readYaml())  def test_books(datas):     if datas['method']=='get':        r=Request().get(url=datas['url'])        assert  datas['expect'] in json.dumps(r.json(),ensure_ascii=False)     elif datas['method']=='post':        r=Request().post(url=datas['url'],json=datas['dict1'])        assert datas['expect'] in json.dumps(r.json(),ensure_ascii=False)     elif datas['method']=='put':        r=Request().put(url=datas['url'],json=datas['dict1'])        assert datas['expect'] in json.dumps(r.json(), ensure_ascii=False)     elif datas['method']=='delete':        r=Request().delete(url=datas['url'])        assert datas['expect'] in json.dumps(r.json(), ensure_ascii=False)      if __name__ == '__main__':      pytest.main(["-v","-s","wxPytest.py"])

被測試的API的源碼為:

#!/usr/bin/python3  #coding:utf-8  from flask import  Flask,make_response,jsonify,abort,request  from flask_restful import  Api,Resource  from flask_httpauth import  HTTPBasicAuth    app=Flask(__name__)  api=Api(app=app)  auth=HTTPBasicAuth()      @auth.get_password  def get_password(name):     if name=='admin':        return 'admin'  @auth.error_handler  def authoorized():     return make_response(jsonify({'msg':"請認證"}),401)    books=[     {'id':1,'author':'wuya','name':'Python介面自動化測試實戰','done':True},     {'id':2,'author':'無涯','name':'Selenium3自動化測試實戰','done':False}  ]      class Books(Resource):     # decorators = [auth.login_required]     def get(self):        return jsonify({'status':0,'msg':'ok','datas':books})       def post(self):        if not request.json:           return jsonify({'status':1001,'msg':'請求參數不是JSON的數據,請檢查,謝謝!'})        else:           book = {              'id': books[-1]['id'] + 1,              'author': request.json.get('author'),              'name': request.json.get('name'),              'done': True           }           books.append(book)           return jsonify({'status':1002,'msg': '添加書籍成功','datas':book}, 201)      class Book(Resource):     # decorators = [auth.login_required]     def get(self,book_id):        book = list(filter(lambda t: t['id'] == book_id, books))        if len(book) == 0:           return jsonify({'status': 1003, 'msg': '很抱歉,您查詢的書的資訊不存在'})        else:           return jsonify({'status': 0, 'msg': 'ok', 'datas': book})       def put(self,book_id):        book = list(filter(lambda t: t['id'] == book_id, books))        if len(book) == 0:           return jsonify({'status': 1003, 'msg': '很抱歉,您查詢的書的資訊不存在'})        elif not request.json:           return jsonify({'status': 1001, 'msg': '請求參數不是JSON的數據,請檢查,謝謝!'})        elif 'author' not in request.json:           return jsonify({'status': 1004, 'msg': '請求參數author不能為空'})        elif 'name' not in request.json:           return jsonify({'status': 1005, 'msg': '請求參數name不能為空'})        elif 'done' not in request.json:           return jsonify({'status': 1006, 'msg': '請求參數done不能為空'})        elif type(request.json['done'])!=bool:           return jsonify({'status': 1007, 'msg': '請求參數done為bool類型'})        else:           book[0]['author'] = request.json.get('author', book[0]['author'])           book[0]['name'] = request.json.get('name', book[0]['name'])           book[0]['done'] = request.json.get('done', book[0]['done'])           return jsonify({'status': 1008, 'msg': '更新書的資訊成功', 'datas': book})       def delete(self,book_id):        book = list(filter(lambda t: t['id'] == book_id, books))        if len(book) == 0:           return jsonify({'status': 1003, 'msg': '很抱歉,您查詢的書的資訊不存在'})        else:           books.remove(book[0])           return jsonify({'status': 1009, 'msg': '刪除書籍成功'})    api.add_resource(Books,'/v1/api/books')  api.add_resource(Book,'/v1/api/book/<int:book_id>')      if __name__ == '__main__':      app.run(debug=True)

到測試的目錄下,執行命令:

pytest -v -s –html=report.html

執行如上的命令後,就會顯示執行的結果資訊以及生成對應的HTML測試報告,如下圖所示:

執行成功後,會在當前的目錄下生成report.html的文件,打開後,就會顯示基於HTML的測試報告,如下圖所示:

在測試報告中可以很清晰的看到執行測試點的總數,以及成功的和失敗的資訊。