最近需要實現一個功能,使用Jmeter自動生成測試報告。Jmeter腳本存放在Git倉庫,現在需要實現在腳本發生更新時才自動生成測試報告。
我的思路是這樣的:在拉取Git項目之前通過git rev-list --count HEAD
命令記錄一個版本號,然後在拉取項目完成生成之後生成測試報告之前再通過此命令獲取另一個版本號。比較這兩個版本號,如果相同,則不自動生成測試報告,如果不同,則自動生成測試報告。
在本地測試如下:
首先寫一個腳本,獲取Git項目的版本號。
#!/usr/bin/env python
# Author: Robin Wen
# Date: 18:15:25 2014-12-24
# Desc: Get repo version.
# FileName: get_git_version.py
import subprocess, os
os.chdir('YOUR_PATH')
lcmd='git rev-list --count HEAD'
res=subprocess.call(lcmd, shell=True)
然後寫一個測試腳本,內容如下:
#!/usr/bin/env python
# Author: Robin Wen
# Date: 18:16:54 2014-12-24
# Desc: Test get repo version.
# FileName: test_result.py
import os
# 僅做測試,這個腳本的執行結果當然是equal。
os.system("python /Users/robin/get_git_version.py > old.log")
os.system("python /Users/robin/get_git_version.py > new.log")
file = open('old.log', 'r')
old=file.read()
file.close()
file = open('new.log', 'r')
new=file.read()
file.close()
print old
print new
if old == new:
print "equal"
else:
print "not"
腳本使用方法:首先在拉取之前獲得一次版本號,然後在拉取之後再獲得一次版本號,就可以判斷出項目是否發生更新了。
但問題來了,我是想實現遠程自動化生成測試報告。現在就輪到Fabric
上場了。
Fabric是一個Python的遠程執行和部署工具,使用相當簡潔。
GitHub地址:
官網:
其中,遠程調用使用Fabric提供的run方法,此方法和Ruby中的run有異曲同工之妙。
下面,談到本文的核心了。使用Fabric讀取遠程文件需要使用StringIO模塊和get()方法,通過StringIO模塊的getvalue()方法獲取文件內容。
下面是腳本的核心代碼:
#!/usr/bin/env python
#encoding:utf-8
# Author: Robin Wen
# Date: 22/22/2014 15:02:20
# Desc: Auto generate testing reports.
# Import necessary packages.
import os
from StringIO import StringIO
from fabric.api import env, cd, prefix, sudo, run, hide, local, put, get, settings
from fabric.contrib.files import exists, upload_template
from fabric.colors import yellow, green, blue, red
# Update the repo via git.
def git_pull():
print green('Update the repo via git.')
# Get current git version.
run('python '+script_dir+'/get_git_version.py > '+script_dir+'/old.log')
# Git Pull.
with cd(git_repo):
run('git pull')
print green('Update the repo via git.')
# Auto generate testing reports.
def auto_gen():
print green('Auto generate testing reports.')
run('python '+script_dir+'/get_git_version.py > '+script_dir+'/new.log')
fd = StringIO()
get(script_dir+'/old.log', fd)
old=fd.getvalue()
fd = StringIO()
get(script_dir+'/new.log', fd)
new=fd.getvalue()
if old == new:
print red('Nothing changed, it won\'t generate testing reports.')
else:
run('ant -buildfile '+script_dir+'/build.xml gen-testing-report')
print green('Auto generate testing reports finished!')
在遠程服務器調用該腳本即可,具體使用方法可以參考此處,該項目已經托管在GitHub上。