芯片的测试有上千条用例,如果每条都是手动执行的话,在芯片版本迭代的过程中将会耗费大量的人力,所以采用芯片的自动化测试来代替繁重的体力劳动。
但是网上的一些工具适合做测试用例管理的要收费,不收费的功能又不太适合,选了几天,没找到合适的,于是决定用Python自己实现一个简单易用并且可行的管理工具。
选择Python是因为现在做芯片验证自动化的主流语言是Python,而且它功能强大。废话不多说,先来介绍一下自动化测试的需求。
1、能够通过串口或者网口连接到远端的机器,这里我采用的是PC通过网口连接远端的一个linux系统的host,通过串口连接另外一台嵌入式开发板。
这个网口和串口的Python脚本可以参考我之前的文章,由于我这里要说的自动化的管理框架不关心和远端的连接,所以这里不再对串口和网口进行详细说明。
2、运行一个main.py的主程序,它会打开一个本地的html文件,然后在浏览器端出现一个可视化的选择窗口,你可以根据你的测试需要选择你要进行自动化的用例,然后提交后自动的执行。如下图
如图,可以点击全选和全不选,还有指定某几项选中或者某几项不选中。选择好了以后,点击提交前的方框,自动化测试用例集就会自动的开始运行了,运行的过程中会输出结果到一个excel表格中。如下图
代码实现如下,在test.py 中只关注输出结果到excel的那句调用就好了,其它的代码都不重要。
#!/usr/bin/python3
# _*_coding:UTF-8 _*_
import time
from op_excel import out_result_to_excel
def test1():
out_result_to_excel(1, "水仙花数的遍历", 'true')
def test2():
out_result_to_excel(2,"打印当前时间的值", 'true')
def test3():
out_result_to_excel(3, "成绩等级打印", 'true')
def test4():
out_result_to_excel(4,"打印当前时间的值", 'true')
现在看看html的内容,主要是checkbox和提交的按键的ui布局,以及全选和全不选,或者指定几项的选择的功能实现。只贴代码,如下:
<body>
<div class="wrap">
<table>
<thead>
<tr>
<th>
<input type="checkbox" id="theadInp" />
</th>
<th>用例ID</th>
<th>用例名</th>
<th>
<input type="checkbox" id="submit1" />
</th>
<th>提交</th>
</tr>
</thead>
<tbody id="tbody">
<tr>
<td>
<input id="1" type="checkbox" />
</td>
<td> 1 </td>
<td>发送一个报文</td>
</tr>
<tr>
<td>
<input id="2" type="checkbox" />
</td>
<td> 2 </td>
<td>接收一个报文</td>
</tr>
<tr>
<td>
<input id="3" type="checkbox" />
</td>
<td> 3 </td>
<td>发送完成中断</td>
</tr>
<tr>
<td>
<input id="4" type="checkbox" />
</td>
<td> 4 </td>
<td>接收完成中断</td>
</tr>
</tbody>
</table>
</div>
</body>
<style>
* {
padding: 0;
margin: 0;
}
.wrap {
width: 300px;
margin: 100px auto 0;
}
table {
border-collapse: collapse;
border-spacing: 0;
border: 1px solid #c0c0c0;
width: 300px;
}
th,
td {
border: 1px solid #d0d0d0;
color: #404060;
padding: 10px;
}
th {
background-color: #09c;
font-size: 16px;
color: #fff;
}
td {
font-size: 14px;
}
tbody tr {
background-color: #f0f0f0;
}
tbody tr:hover {
cursor: pointer;
background-color: #fafafa;
}
</style>
<script>
window.onload = function () {
var topInp = document.getElementById("theadInp");
var tbody = document.getElementById("tbody");
var botInpArr = tbody.getElementsByTagName("input");
var submit1 = document.getElementById("submit1");
//绑定事件
topInp.onclick = function () {
for (var i = 0; i < botInpArr.length; i++) {
botInpArr[i].checked = this.checked;
}
}
for (var i = 0; i < botInpArr.length; i++) {
botInpArr[i].onclick = function () {
//定义一个标识是true还是false的变量
//默认它为true
var bool = true;
//检测每一个input的checked属性值。只要有一个没有check√,全选的check就得是false
for (var j = 0; j < botInpArr.length; j++) {
if (botInpArr[j].checked == false) {
bool = false;
}
}
topInp.checked = bool;
}
}
}
</script>
下面用Python对html的内容进行解析,主要就是获取网页里的checked box的ID,然后加入到列表里面,然后调用python脚本的执行命令,执行对应的自动化测试用例程序。代码如下:
#!/usr/bin/python3
# _*_coding:UTF-8 _*_
import re
import os
from time import sleep
from selenium import webdriver
from comm_interface import *
from test import *
def get_check_result(list_all):
l=[]
for i in range(len(list_all)):
s = driver.find_element_by_id(list_all[i]).is_selected()
if s == True:
#print(list_all[i])
l.append(list_all[i])
return l
if __name__ == '__main__':
flag_ui=1
list_all=[ 'test1','test2','test3','test4' ]# should be the same with the id in html
checked_list=[]
init()
filename=create_xls_file()
driver = webdriver.Chrome()#driver = webdriver.Firefox()
#driver = webdriver.Chrome("C:\Program Files (x86)\Google\Chrome\Application\chromedriver.exe")
driver.get(r"file:///C:/work/auto_test_local/test_.html")
while True:
if True == driver.find_element_by_id('submit1').is_selected():
checked_list = get_check_result(list_all)
break
if flag_ui == 0:
test_table = [
'test1',
'test2',
'test3',
'test4'
]
else:
test_table = checked_list
for i in range(1, len(test_table) + 1):
cmd='test'+str(i)
print("==================2秒后开始执行用例 %s ==============\n" % test_table[i-1])
sleep(1)
eval(cmd)()
print("================== 执行用例 %s 完成 =================\n" % test_table[i-1])
store_copy_excel()
uninit()
下面是对测试结果输出到excel的代码:
#!/usr/bin/python3
# _*_coding:UTF-8 _*_
from xlutils.copy import copy
import xlrd
import xlwt
import time
def create_xls_file():
filename='test.xls'
row0 = [u'测试ID',u'测试用例名',u'时间',u'测试结果']
workbook = xlwt.Workbook(encoding='utf-8')
sheet1 = workbook.add_sheet("sheet1")
workbook.save(filename)
oldWb = xlrd.open_workbook(filename)
newWb = copy(oldWb)
sheet_name = newWb.get_sheet(0);
for i in range(0, len(row0)):
sheet_name.write(0, i, row0[i]);#写入 2行4列写入pass
newWb.save(filename)
return filename
def out_result_to_excel(idno,name,result):
l=[]
l.append(idno)
l.append(name)
timenow = time.strftime("%Y%m%d-%X",time.localtime())
l.append(timenow)
l.append(result)
oldWb = xlrd.open_workbook("test.xls");#先打开已存在的表
newWb = copy(oldWb)#复制
newWs = newWb.get_sheet(0);#取sheet表
for i in range(0, len(l)):
newWs.write(idno, i, l[i]);#写入 2行4列写入pass
newWb.save("test.xls")
def store_copy_excel():
oldWb = xlrd.open_workbook("test.xls");#先打开已存在的表
newWb = copy(oldWb)#复制
newWs = newWb.get_sheet(0);#取sheet表
filename = time.strftime("%Y%m%d",time.localtime())
filename='test_result_'+filename+'.xls'
newWb.save(filename)
#newWb.del('test.xls')
注:本测试都是在Ubuntu环境下进行测试的,相关的一些库需要自己安装
geckodriver linkage: https://npm.taobao.org/mirrors/geckodriver
pip3 install xlutils
pip3 install xlrd
pip3 install copy