Python3+requests搭建接口自動(dòng)化測(cè)試框架


一庆寺、接口自動(dòng)化的意義

新版本上線時(shí)之前版本的功能需要進(jìn)行回歸測(cè)試,導(dǎo)致大量的重復(fù)性手工測(cè)試诉字。引入自動(dòng)化測(cè)試可以使用自動(dòng)化技術(shù)代替部分手工的回歸性測(cè)試懦尝,解放更多人力做其它更有必要的事情。但目前項(xiàng)目UI變動(dòng)頻繁壤圃,而接口一般不會(huì)做大變動(dòng)所以先暫時(shí)做接口自動(dòng)化陵霉。使用接口自動(dòng)化可以做上線前接口功能的回歸性測(cè)試,也可以定時(shí)巡檢線上環(huán)境接口的運(yùn)行情況伍绳,能及時(shí)發(fā)現(xiàn)線上環(huán)境接口問題并解決踊挠。同時(shí)此框架可以幫助不會(huì)寫代碼的測(cè)試同事進(jìn)行接口自動(dòng)化的相關(guān)工作。

二冲杀、準(zhǔn)備工作

? ? 開發(fā)語言:Python3

需要安裝的模塊:

Requests: python的一個(gè)HTTP客戶端庫效床,和urllib、urllib2類似权谁。

1剩檀、安裝方法:

使用pip安裝

pip?install?Requests

或?

python3?-m?pip?install?Requests? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

下載源碼后安裝

git clone git://github.com/kennethreitz/requests.git

cd requests

python setup.py install

xlsxwriter:是python用來構(gòu)造xlsx文件的模塊,可以完成xlsx文件的自動(dòng)化構(gòu)造闯传,包括:合并單元格谨朝,制作excel圖表等功能卤妒。

1甥绿、安裝方法:

使用pip安裝

pip?install?Requests

或?

python3?-m?pip?install?Requests

三、框架流程及邏輯

框架理念:使用json文件編寫測(cè)試用例则披,建一個(gè)腳本循環(huán)讀取測(cè)試用例并執(zhí)行共缕,然后對(duì)比返回的接口和用例中的期望結(jié)果。將測(cè)試結(jié)果寫入到一個(gè)excel表格中生成測(cè)試報(bào)告士复,最后使用發(fā)送郵件功能將測(cè)試報(bào)告發(fā)送到指定郵箱图谷。其中對(duì)所有公共方法進(jìn)行封裝并放在common公共文件目錄下翩活。

四、各模塊介紹

----interface_test ? ? ? ? ? ? ? ? ? ? ? ? ? ? 項(xiàng)目文件夾目錄

? ? ----common ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?存放公共方法目錄

? ? ? ? ? ? ----__init__.py ? ? ? ? ? ? ? ? ? ?初始化文件

? ? ? ? ? ? ----conf.py ? ? ? ? ? ? ? ? ? ? ? ? ?操作配置文件相關(guān)方法

? ? ? ? ? ? ----excelaction.py ? ? ? ? ? ? ? ?Excel文件相關(guān)操作方法

? ? ? ? ? ? ----jsonaction.py ? ? ? ? ? ? ? ? Json文件相關(guān)操作方法

? ? ? ? ? ? ----logger.py ? ? ? ? ? ? ? ? ? ? ? 記錄日志的相關(guān)方法

? ? ? ? ? ? ----newfile.py ? ? ? ? ? ? ? ? ? ? ?獲取最新文件的相關(guān)方法

? ? ? ? ? ? ----sendmail.py ? ? ? ? ? ? ? ? ? 發(fā)送報(bào)告到指定郵箱的相關(guān)方法

? ? ? ? ? ? ----signture.py ? ? ? ? ? ? ? ? ? ?對(duì)數(shù)據(jù)進(jìn)行簽名的相關(guān)方法

? ? ? ? ? ? ----userinfo.py ? ? ? ? ? ? ? ? ? ?獲取用戶信息的相關(guān)方法

? ? ? ? ? ? ----config_test.conf ? ? ? ? ? ? 基本配置文件

? ? ----logs ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 存放日志的目錄

? ? ----report ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?存放測(cè)試報(bào)告的目錄

? ? ----test_data ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?存放測(cè)試用例數(shù)據(jù)的目錄

? ? ? ? ? ? ----login-1.json ? ? ? ? ? ? ? ? ? ?登錄接口的測(cè)試用例數(shù)據(jù)

? ? ? ? ? ? ----logout-2.json ? ? ? ? ? ? ? ? ?退出登錄接口的測(cè)試用例數(shù)據(jù)

? ? ----execute_test.py ? ? ? ? ? ? ? ? ? ? ? 讀取測(cè)試用例并執(zhí)行測(cè)試用例

----test.bat ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?運(yùn)行測(cè)試項(xiàng)目的批處理文件

execute_test.py 主要程序

1 # -*- coding: utf-8 -*-

? 2 #!/usr/bin/env python? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

? 3 import os? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

? 4 import json? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

? 5 import requests? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

? 6 import common.conf as conf? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

? 7 import common.excelaction as excelaction? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

? 8 from common.sendemail import sendreport? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

? 9 from common.signture import sign? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

10 import common.userinfo as userinfo? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

11 import common.logger as logger? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

12 import sys? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

13 import time? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

14? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

15 #data_path = os.path.dirname(__file__) + '\\test_data\\' # 測(cè)試用例數(shù)據(jù)文件所在目錄? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

16 data_path = conf.testdata_path? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

17? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

18 test_reports = [] # 添加一個(gè)數(shù)組用來存儲(chǔ)測(cè)試結(jié)果? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

19 for file in os.listdir(data_path): # 循環(huán)讀取目錄下的文件? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

20? ? child = os.path.join('%s%s'%(data_path,file)) # 將文件名和路徑拼接好? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

21? ? logger.info("當(dāng)前打開的文件:"+child)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

22? ? fl = open(child) # 打開文件? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

23? ? try:? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

24? ? ? ? cases = json.load(fl)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

25? ? ? ? for key in cases: # 循環(huán)讀取文件中的測(cè)試用例(case)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

26? ? ? ? ? ? start_time = time.clock()? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

27? ? ? ? ? ? case = cases[key]? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

28? ? ? ? ? ? url = conf.get_conf('module',case['module']) + case['url']? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

29? ? ? ? ? ? data = case['data']? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

30? ? ? ? ? ? data['Platform'] = conf.get_conf('params','Platform')? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

31? ? ? ? ? ? data['Terminal'] = conf.get_conf('params','Terminal')? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

32? ? ? ? ? ? data['UserIP'] = conf.get_conf('params','UserIP')? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

33? ? ? ? ? ? data['Version'] = conf.get_conf('params','Version')? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

34? ? ? ? ? ? if "UserToken" in data and data['UserToken'] == '':? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

35? ? ? ? ? ? ? ? data['UserToken'] = userinfo.get_token()? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

36? ? ? ? ? ? hope_result = case['assert']? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

37? ? ? ? ? ? method = case['method']? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

38? ? ? ? ? ? test_report = {? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

39? ? ? ? ? ? ? ? "case_id":case['id'],? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

40? ? ? ? ? ? ? ? "t_name":case['name'],? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

41? ? ? ? ? ? ? ? "method":method,? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

42? ? ? ? ? ? ? ? "url":url,? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

43? ? ? ? ? ? ? ? "params":data,? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

44? ? ? ? ? ? ? ? "hope_result":hope_result,? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

45? ? ? ? ? ? ? ? "actual_result":[],? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

46? ? ? ? ? ? ? ? "test_result":""? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

47? ? ? ? ? ? }? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

48? ? ? ? ? ? try:? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

49? ? ? ? ? ? ? ? if method == 'post':? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

50? ? ? ? ? ? ? ? ? ? addsign_data = sign(data,conf.get_conf('sign','api_key'))? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

51? ? ? ? ? ? ? ? ? ? r = requests.post(url,data=json.dumps(addsign_data),headers=conf.header)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

52? ? ? ? ? ? ? ? ? ? response = r.json()? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

53? ? ? ? ? ? ? ? ? ? s = True? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

54? ? ? ? ? ? ? ? ? ? for k in hope_result:? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

55? ? ? ? ? ? ? ? ? ? ? ? ar = str(k) + ":" + str(response[k])? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

56? ? ? ? ? ? ? ? ? ? ? ? test_report["actual_result"].append(ar)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

57? ? ? ? ? ? ? ? ? ? ? ? if type(hope_result[k]) == type(''):? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

58? ? ? ? ? ? ? ? ? ? ? ? ? ? if hope_result[k] in response[k]:? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

59? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? s = s&True? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

60? ? ? ? ? ? ? ? ? ? ? ? ? ? else:? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

61? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? s = s&False? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

62? ? ? ? ? ? ? ? ? ? ? ? else:? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

63? ? ? ? ? ? ? ? ? ? ? ? ? ? if hope_result[k] == response[k]:? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

64? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? s = s&True? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

65? ? ? ? ? ? ? ? ? ? ? ? ? ? else:? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

66? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? s = s&False? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

67? ? ? ? ? ? ? ? ? ? if s:? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

68? ? ? ? ? ? ? ? ? ? ? ? test_report["test_result"] = "PASS"? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

69? ? ? ? ? ? ? ? ? ? else:? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

70? ? ? ? ? ? ? ? ? ? ? ? test_report["test_result"] = "Fail"? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

71? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

72? ? ? ? ? ? ? ? elif method == 'get':? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

73? ? ? ? ? ? ? ? ? ? addsign_data = sign(data,conf.get_conf('sign','api_key'))? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

74? ? ? ? ? ? ? ? ? ? r = requests.get(url,params=addsign_data,headers=conf.header)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

75? ? ? ? ? ? ? ? ? ? response = r.json()? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

76? ? ? ? ? ? ? ? ? ? s = True? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

77? ? ? ? ? ? ? ? ? ? for k in hope_result:? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

78? ? ? ? ? ? ? ? ? ? ? ? ar = str(k) + ":" + str(response[k])? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

79? ? ? ? ? ? ? ? ? ? ? ? test_report["actual_result"].append(ar)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

80? ? ? ? ? ? ? ? ? ? ? ? if type(hope_result[k]) == type(''):? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

81? ? ? ? ? ? ? ? ? ? ? ? ? ? if hope_result[k] in response[k]:? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

82? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? s = s&True? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

83? ? ? ? ? ? ? ? ? ? ? ? ? ? else:? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

84? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? s = s&False? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

85? ? ? ? ? ? ? ? ? ? ? ? else:? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

86? ? ? ? ? ? ? ? ? ? ? ? ? ? if hope_result[k] == response[k]:? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

87? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? s = s&True? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

88? ? ? ? ? ? ? ? ? ? ? ? ? ? else:? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

89? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? s = s&False? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

90? ? ? ? ? ? ? ? ? ? if s:? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

91? ? ? ? ? ? ? ? ? ? ? ? test_report["test_result"] = "PASS"? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

92? ? ? ? ? ? ? ? ? ? else:? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

93? ? ? ? ? ? ? ? ? ? ? ? test_report["test_result"] = "Fail"? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

94? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

95? ? ? ? ? ? ? ? else:? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

96? ? ? ? ? ? ? ? ? ? print(u'暫不支持該請(qǐng)求方式')? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

97? ? ? ? ? ? ? ? test_reports.append(test_report)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

98? ? ? ? ? ? ? ? end_time = time.clock()? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

99? ? ? ? ? ? ? ? str_time = '當(dāng)前執(zhí)行的用例:' + key + '_'*4 + '用例執(zhí)行所用時(shí)間:' + str(end_time-? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? start_time) + 's'? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

100? ? ? ? ? ? ? ? logger.info(str_time)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

101? ? ? ? ? ? except:? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

102? ? ? ? ? ? ? ? error_msg = sys.exc_info()? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

103? ? ? ? ? ? ? ? logger.error(error_msg)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

104? ? ? ? ? ? ? ? continue? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

105? ? except:? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

106? ? ? ? error_msg = sys.exc_info()? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

107? ? ? ? logger.error(error_msg)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

108? ? ? ? continue? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

109? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

110 excelaction.creat_report(test_reports) #生成測(cè)試報(bào)告? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

111 sendreport() #發(fā)送測(cè)試報(bào)告? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

五便贵、具體使用

1菠镇、在配置文件做對(duì)應(yīng)項(xiàng)目的基礎(chǔ)配置

[email] -- 郵箱相關(guān)配置

sender = ***@163.com -- 發(fā)件郵箱

receiver = ***@163.com -- 收件郵箱

smtpserver = smtp.163.com -- 發(fā)件郵箱服務(wù)器

username = ***@163.com -- 發(fā)件郵箱賬戶名

password = **** -- 發(fā)件郵箱密碼(用于第三方登錄的秘密)

[module] -- 模塊相關(guān)接口域名配置

passport = http://passport.XXX.com/ -- 對(duì)應(yīng)模塊接口域名

[sign] -- 簽名相關(guān)的配置

api_key = XXX-XXX -- 生成簽名的key(填寫項(xiàng)目對(duì)應(yīng)的key)

[params] -- 接口參數(shù)配置(配置公共參數(shù))

Platform = 1 -- 根據(jù)對(duì)應(yīng)項(xiàng)目配置對(duì)應(yīng)的公共參數(shù)和對(duì)應(yīng)值

2、在test_data文件夾內(nèi)用json文件寫測(cè)試用例和對(duì)應(yīng)參數(shù)?

"case1":{

? ? "name":"登錄接口_測(cè)試正常登錄",? ? ? ? -- 接口名稱(或者接口簡(jiǎn)介)

? ? "module":"passport",? ? ? ? ? ? ? ? -- 接口所屬模塊

? ? "url":"/api/Passport/Login",? ? ? ? ? ? -- 接口地址(完整地址由模塊對(duì)應(yīng)域名+該地址拼接)

? ? ? "method":"post",? ? ? ? ? ? ? ? ? ? -- 接口請(qǐng)求方式

? ? ? "id":"1-001",? ? ? ? ? ? ? ? ? ? ? ? -- 用例ID

? ? "data":{? ? ? ? ? ? ? ? ? ? ? ? ? ? -- 接口請(qǐng)求參數(shù)(請(qǐng)求時(shí)由該參數(shù)加公共參數(shù))

? ? ? ? "UserName":"XXX",? ? ? ? ? ? ? ? -- 接口請(qǐng)求參數(shù)(根據(jù)具體接口補(bǔ)充承璃,如果接口需要token則需要加token關(guān)鍵字(值為空就行)利耍,接口請(qǐng)求時(shí)會(huì)自動(dòng)根據(jù)參數(shù)生成Sign,如果想自己定義則需要加Sign關(guān)鍵字(值填寫自己定義的))

? ? ? ? },

? ? "assert":{? ? ? ? ? ? ? ? ? ? ? ? ? ? -- 該條測(cè)試用例的斷言條件

? ? ? ? "Status":200,? ? ? ? ? ? ? ? ? ? -- 具體的斷言條件盔粹,需要返回狀態(tài)為200

? ? ? ? "Message":"登錄成功"? ? ? ? ? ? -- 具體的斷言條件

? ? ? ? }

? ? }

3隘梨、配置好基礎(chǔ)配置和編寫完測(cè)試用例后,運(yùn)行項(xiàng)目中的test.bat文件舷嗡。運(yùn)行完成后會(huì)在report文件夾內(nèi)生成測(cè)試報(bào)告文件轴猎,在logs文件夾內(nèi)會(huì)生成測(cè)試運(yùn)行過程中的記錄日志和報(bào)錯(cuò)日志

創(chuàng)建了一個(gè)測(cè)試交流群,如果對(duì)軟件測(cè)試进萄、接口測(cè)試捻脖、自動(dòng)化測(cè)試、面試經(jīng)驗(yàn)交流感興趣可以加測(cè)試交流群:829792258中鼠,還會(huì)有同行一起技術(shù)交流

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末郎仆,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子兜蠕,更是在濱河造成了極大的恐慌扰肌,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,331評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件熊杨,死亡現(xiàn)場(chǎng)離奇詭異曙旭,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)晶府,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,372評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門桂躏,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人川陆,你說我怎么就攤上這事剂习。” “怎么了较沪?”我有些...
    開封第一講書人閱讀 167,755評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵鳞绕,是天一觀的道長。 經(jīng)常有香客問我尸曼,道長们何,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,528評(píng)論 1 296
  • 正文 為了忘掉前任控轿,我火速辦了婚禮冤竹,結(jié)果婚禮上拂封,老公的妹妹穿的比我還像新娘。我一直安慰自己鹦蠕,他們只是感情好冒签,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,526評(píng)論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著钟病,像睡著了一般镣衡。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上档悠,一...
    開封第一講書人閱讀 52,166評(píng)論 1 308
  • 那天廊鸥,我揣著相機(jī)與錄音,去河邊找鬼辖所。 笑死惰说,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的缘回。 我是一名探鬼主播吆视,決...
    沈念sama閱讀 40,768評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼酥宴!你這毒婦竟也來了啦吧?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,664評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤拙寡,失蹤者是張志新(化名)和其女友劉穎授滓,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體肆糕,經(jīng)...
    沈念sama閱讀 46,205評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡般堆,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,290評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了诚啃。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片淮摔。...
    茶點(diǎn)故事閱讀 40,435評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖始赎,靈堂內(nèi)的尸體忽然破棺而出和橙,到底是詐尸還是另有隱情,我是刑警寧澤造垛,帶...
    沈念sama閱讀 36,126評(píng)論 5 349
  • 正文 年R本政府宣布魔招,位于F島的核電站,受9級(jí)特大地震影響筋搏,放射性物質(zhì)發(fā)生泄漏仆百。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,804評(píng)論 3 333
  • 文/蒙蒙 一奔脐、第九天 我趴在偏房一處隱蔽的房頂上張望俄周。 院中可真熱鬧,春花似錦髓迎、人聲如沸峦朗。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,276評(píng)論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽波势。三九已至,卻和暖如春橄维,著一層夾襖步出監(jiān)牢的瞬間尺铣,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,393評(píng)論 1 272
  • 我被黑心中介騙來泰國打工争舞, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留凛忿,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,818評(píng)論 3 376
  • 正文 我出身青樓竞川,卻偏偏與公主長得像店溢,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子委乌,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,442評(píng)論 2 359