芯片的测试有上千条用例,如果每条都是手动执行的话,在芯片版本迭代的过程中将会耗费大量的人力,所以采用芯片的自动化测试来代替繁重的体力劳动。

但是网上的一些工具适合做测试用例管理的要收费,不收费的功能又不太适合,选了几天,没找到合适的,于是决定用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

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐