精华内容
下载资源
问答
  • 两种web免登录自动化测试实现方法及比较

    在做web测试过程中,通常需要先登录被测系统,有的网站登录需要验证码,这无疑增加了测试时间成本,怎么才能实现免登陆?今天我为大家介绍两种方法

    一、通过selenium的Cookie类的相关操作,保存和加载浏览器的cookie,实现免登陆

    通过查看selenium的api或源码,可以发现cookie类有以下字段,并有相应的set, get方法和多个重载的构造方法:


    1.保存登录后的浏览器cookie,代码如下:

    以登录M京东为例,可以通过输入账号和密码来登录,这里通过社交账号联合登录,登录成功后记录cookie到本地文件

    @DataProvider(name="getQQ")
    public Object[][] getQQ() {
    return new Object[][] {
    // {"979320969"},
    {"3454608466"},
    };
    }

    @Test(dataProvider="getQQ")
    public void saveCookie_mjd(String qq) throws IOException {
    driver.get("https://plogin.m.jd.com/user/login.action?appid=100");
    driver.findElement(By.linkText("QQ")).click();
    try {
    driver.switchTo().frame("ptlogin_iframe");

    } catch (NoSuchFrameException e) {
    driver.findElement(By.className("ch_uin")).click(); //切换其他账号
    driver.switchTo().alert().accept();
    driver.switchTo().frame("ptlogin_iframe");

    }
    driver.findElement(By.id("nick_"+qq)).click();
    driver.switchTo().defaultContent();
    Assert.assertTrue(driver.getCurrentUrl().contains("https://m.jd.com"));


    Set<Cookie> set = driver.manage().getCookies();
    File cookieFile = new File("./cookies"+qq+".txt");
    if (cookieFile.exists()) {
    cookieFile.delete();
    cookieFile.createNewFile();
    }


    BufferedWriter bw = new BufferedWriter(new FileWriter(cookieFile));
    for (Cookie cookie : set) {
    String name = cookie.getName();
    String value = cookie.getValue();
    String domain = cookie.getDomain();
    String path = cookie.getPath();
    Date expiry = cookie.getExpiry();
    // Date expiry = null;
    // if (cookie.getExpiry()!=null) {
    // expiry= DateFormatUtils.format(cookie.getExpiry(), "yyyy-MM-dd HH:mm:ss");
    // }
    boolean httpOnly = cookie.isHttpOnly();
    boolean secure = cookie.isSecure();


    bw.write(name+";"+value+";"+domain+";"+path+";"+expiry+";"+secure+";"+httpOnly);
    bw.newLine();
    }
    bw.flush();
    bw.close();
    driver.manage().deleteAllCookies();
    }

    2.再次登录加载已保存的cookie

    @Test
    public void testLoadCookie() throws IOException{
    driver.get("https://m.jd.com/");
    loadCookies("3454608466");
    driver.get("http://home.m.jd.com/myJd/newhome.action");
    Assert.assertTrue(driver.getTitle().contains("京东触屏版"));
    Assert.assertTrue(driver.findElement(By.className("my-info")).isDisplayed());
    System.out.println("M京东登录成功");
    // 其他测试步骤 略……
    }

    private void loadCookies(String qq) throws IOException {
    driver.manage().deleteAllCookies();
    File file = new File("./cookies"+qq+".txt");
    BufferedReader br;
    try {
    br = new BufferedReader(new FileReader(file));
    String line = null;
    while ((line=br.readLine())!=null) {
    String[] cookieFilds = line.split(";");
    String name = cookieFilds[0].trim();
    String value = cookieFilds[1].trim();
    String domain = cookieFilds[2].trim();
    String path = cookieFilds[3].trim();
    Date expiry = null;
    if (!cookieFilds[4].equals(null)) {
    expiry = DateUtils.parseDate(cookieFilds[4]);
    }


    boolean httpOnly = Boolean.valueOf(cookieFilds[5]);
    boolean secure = Boolean.valueOf(cookieFilds[6]);


    Cookie cookie = new Cookie(name, value, domain, path, expiry, secure, httpOnly);
    driver.manage().addCookie(cookie);
    }
    br.close();
    } catch (FileNotFoundException e) {
    System.out.println("cookies文件不存在,调用saveCookie_mjd方法重新保存cookies");
    saveCookie_mjd(qq);
    }


    }

    二、通过第三方组件browsermob-proxy,这个组件是开源的,可以从https://github.com/lightbody/browsermob-proxy获取最新release源码,本地测试工程的pom.xml配置如下:

    <!-- https://mvnrepository.com/artifact/net.lightbody.bmp/browsermob-core-littleproxy -->
    <dependency>
        <groupId>net.lightbody.bmp</groupId>
        <artifactId>browsermob-core-littleproxy</artifactId>
        <version>2.1.0-beta-6</version>
    </dependency>
    手工登录后,复制浏览器的cookie

    然后通过browsermob-proxy组件的接口修改request请求头信息添加cookie

       @Test
        public void test22() throws Exception {
            // 启动 proxy
            BrowserMobProxyServer server = new BrowserMobProxyServer();
            server.start();
    
            // 获取一个 Selenium proxy 对象
            Proxy seleniumProxy = ClientUtil.createSeleniumProxy(server);
    
            // 配置 capability
            DesiredCapabilities capabilities = new DesiredCapabilities();
            capabilities.setCapability(CapabilityType.PROXY, seleniumProxy);
    
            // 启动浏览器
            WebDriver driver = new FirefoxDriver(capabilities);
            driver.manage().window().maximize();
            // 从浏览器复制urlcookie,,设置测试urlcookie
            String testUrl = "测试地址url";
            final String cookieValue = "从浏览器复制的cookie"; //登录后获取请求中cookie的那长串内容
            server.addRequestFilter(new RequestFilter() {
                @Override
                public HttpResponse filterRequest(HttpRequest request, HttpMessageContents contents, HttpMessageInfo messageInfo) {
                    request.headers().add("Cookie", cookieValue);
                    return null;
                }
            });
            driver.get(testUrl);
            Thread.sleep(3000);
    //        剩余测试步骤……
            driver.quit();
            server.stop();
        }
    接下来,登录成功,可以继续余下测试步骤……


    以上两种方法,第一种保存和设置cookie比较繁琐,但是理解起来比较直观,需要熟悉selenium从cookie类和cookie操作的常用api;第二种方法显示比较简单,但是需要学习browsermob-proxy组件及其接口。如有其它更好的方法实现免登陆,欢迎一起交流探讨!

    展开全文
  • 主要介绍了Python http接口自动化测试框架实现方法,结合实例形式分析了Python针对http接口测试的相关实现与使用操作技巧,需要的朋友可以参考下
  • 自动化测试实现优劣

    2020-05-10 16:00:50
    但要评价自动化测试实现的优劣,就需要拿具体的数据来说话了。究竟自动化测试的效果如何呢?自动化测试有没有真正发挥出来其作用,又如何来评价一个团队自动化测试工作做得好坏呢?以下就跟大家分析一下自动化测试...

    目前互联网测试中,几乎所有团队、所有测试人员都在做自动化测试。但要评价自动化测试实现的优劣,就需要拿具体的数据来说话了。究竟自动化测试的效果如何呢?自动化测试有没有真正发挥出来其作用,又如何来评价一个团队自动化测试工作做得好坏呢?以下就跟大家分析一下自动化测试实现的优劣。

    一、背景

    从自动化测试方法论层面来说,之所以要实现自动化测试,大致有以下几个方面的原因:

    1、提升测试效率

    2、提升测试覆盖度,包括深度和广度

    3、提升测试发现问题后的解决效率

    4、补充手动测试无法覆盖/不易覆盖的场景

    以上是一些实现自动化测试方向性的指导原则,但要评价自动化测试实现的优劣,就需要拿具体的数据来说话了。下面就自己的一点经验,来说说自己对自动化测试优劣的一些体会,不足之处,欢迎大家交流指正。
    在这里插入图片描述

    二、评价自动化测试优劣的常见指标

    互联网公司中,由于绝大多数团队都在重点攻克自动化测试,因而每个团队都指定了相应的评价指标。虽然各个公司,各个团队对指标的侧重不同,但几乎都会关注如下指标。

    1、自动化运行通过率/成功率

    这里排除了代码bug导致的失败。为了避免自动化运行经常失败,大部分团队都会将自动化运行通过率作为一项重要指标,来评判不同模块/业务线自动化实现的好坏。还将这个指标设置一定的阈值,例如,经历过的有个团队要求自动化运行成功率要大于90%+,最好能100%运行成功。

    这个指标是几乎所有团队都会强调的一个指标了,因为自动化运行通过率/成功率是自动化发挥作用的前提条件。但看这个指标,其实也无法评估自动化实现效果,只能说明自动化运行的比较稳定。

    2、自动化执行频率

    这里的执行频率,排除业务测试,特指每天定时的自动执行。不同团队,根据实际情况不同,有不同的要求。例如,有的团队要求早晚至少各一次,有的团队则要求每天至少执行一次,但无论哪一种,几乎都会形成这样一种现象:各个团队为了让定时自动执行时都通过,每天都要花费一定时间来维护自动化代码。

    这个指标其实也是一种评估自动化运行是否稳定的指标。执行的频率越高,加上执行的通过率/成功率越高,说明自动化运行的越稳定。

    3、自动化case数量/覆盖场景数

    这个指标不同业务线之间,其实没有太大的可比性。但同一个业务线上,还是可以作为参考指标的。自动化case多、覆盖的场景多,至少一定程度上说明了自动化的覆盖范围。这个指标可以一定程度上来评估自动化测试的广度、深度。

    4、自动化发现bug比例

    如果说自动化运行通过率/成功率、自动化执行频率、自动化case数量/覆盖场景数还是评价自动化优劣的过程指标,那么自动化发现bug比例就是最有力的结果性指标了。试想一种极端情况,如果一个自动化项目,跑了N久后,还没有发现过bug,那么这个自动化的价值是不是要打一个大大的问号呢?

    自己经历的团队,以及曾经接触过的团队,其实对自动化发现bug比例的侧重反而不是那么高。

    这个指标可以说是众多指标中,最能立竿见影的说明自动化实现效果的指标了。自动化发现bug的比例越高,说明自动化在实际的项目中发挥的作用越大。甚至可以用自动化发现bug率是100%,来作为自动化测试的终极目标。

    如果对软件测试、接口测试、自动化测试、面试经验交流。感兴趣可以加软件测试交流:1085991341,还会有同行一起技术交流。

    三、评价自动化测试优劣的隐性指标

    关于评价自动化测试的优劣,除了上述常见指标外,还有一些不太容易拿数据说话的指标,这里叫做隐性指标。

    隐性指标主要包括:自动化的维护成本、自动化的运行成本

    1、自动化的维护成本

    针对同一个业务,不同的自动化测试实现方案,对应的维护成本可能天壤之别。诚然,自动化的维护成本,受业务成熟度、迭代速度、项目规范程度影响,但不妨考虑以下情况下,你的维护成本如何:

    新增了一些逻辑(如,接口/服务/应用),对新增部分维护自动化,你需要多长时间;

    删除了一些逻辑(如,接口/服务/应用),对删除部分维护自动化,你需要多长时间;

    修改了一些逻辑(如,接口/服务/应用),对修改部分维护自动化,你需要多长时间;

    在项目迭代速度加快时,并伴有增删改逻辑时,你的自动化脚本还能跟得上吗?其实,这是不少团队都会面临的严峻考验。 一个正处于快速发展的业务,每次业务测试、回归时,可能都会想放弃自动化测试,转而来手工执行测试。因为,自动化测试还要不断调试自动化代码,大概率来不及这次的测试,还不如直接手动测试的效率高。

    2、自动化运行成本

    这里的自动化运行成本是说,从想执行自动化 ~?执行结束 需要符合的人力&时间成本。一般的自动化运行过程大致如下:

    1)创造一些自动化执行条件。比如,找运行数据,设置运行环境等等,这一步如果没有被自动化掉,需要花费人力&时间;

    例如,实现的自动化只能”一条腿走路“,即只实现了半自动化,并没有实现100%的自动化,运行前/中/后可能需要人为参与。

    2)执行自动化。这里主要是自动化运行所需时间,时间越长,导致的等待时间越长。可能你会说,自动化执行的时候,你可以去干别的事情啊,没必要一直等待执行结束。但既然执行了自动化,肯定想像手工测试一样,”马上“看到执行结果,得到及时反馈,才能避免在不同工作间来回切换。

    3)验证自动化结果。一般结果的验证都包含在上一个步骤里面了,但不排除有些验证仍然需要人工来check的情况。这种情况,其实也属于半自动化的一种实现形式。

    4)自动化失败问题排查。各种各样的原因,都会导致自动化运行失败了,比如,数据问题、环境问题、自动化维护不及时、第三方问题等等。自动化失败后,能否比较清晰的给出失败原因,甚至能根据自动化失败结果,直接定位到失败原因,这些做到位了,会让你对自动化爱不释手。

    以上内容希望对你有帮助,有被帮助到的朋友欢迎点赞,评论。

    展开全文
  • 自动化功能测试方法实现自动化功能测试方法实现自动化功能测试方法实现
  • 本文实例讲述了Python http接口自动化测试框架实现方法。分享给大家供大家参考,具体如下:一、测试需求描述对服务后台一系列的http接口功能测试。输入:根据接口描述构造不同的参数输入值输出:XML文件eg:...

    本文实例讲述了Python http接口自动化测试框架实现方法。分享给大家供大家参考,具体如下:

    一、测试需求描述

    对服务后台一系列的http接口功能测试。

    输入:根据接口描述构造不同的参数输入值

    输出:XML文件

    eg:http://xxx.com/xxx_product/test/content_book_list.jsp?listid=1

    二、实现方法

    1、选用Python脚本来驱动测试

    2、采用Excel表格管理测试数据,包括用例的管理、测试数据录入、测试结果显示等等,这个需要封装一个Excel的类即可。

    3、调用http接口采用Python封装好的API即可

    4、测试需要的http组装字符转处理即可

    5、设置2个检查点,XML文件中的返回值字段(通过解析XML得到);XML文件的正确性(文件对比)

    6、首次执行测试采用半自动化的方式,即人工检查输出的XML文件是否正确,一旦正确将封存XML文件,为后续回归测试的预期结果,如果发现错误手工修正为预期文件。(注意不是每次测试都人工检查该文件,只首次测试的时候才检查)

    三、Excel表格样式

    201812693545581.png?201811694139

    四、实现代码(代码才是王道,有注释很容易就能看明白的)

    1、测试框架代码

    #****************************************************************

    # TestFrame.py

    # Author : Vince

    # Version : 1.1.2

    # Date : 2011-3-14

    # Description: 自动化测试平台

    #****************************************************************

    import os,sys, urllib, httplib, profile, datetime, time

    from xml2dict import XML2Dict

    import win32com.client

    from win32com.client import Dispatch

    import xml.etree.ElementTree as et

    #import MySQLdb

    #Excel表格中测试结果底色

    OK_COLOR=0xffffff

    NG_COLOR=0xff

    #NT_COLOR=0xffff

    NT_COLOR=0xC0C0C0

    #Excel表格中测试结果汇总显示位置

    TESTTIME=[1, 14]

    TESTRESULT=[2, 14]

    #Excel模版设置

    #self.titleindex=3 #Excel中测试用例标题行索引

    #self.casebegin =4 #Excel中测试用例开始行索引

    #self.argbegin =3 #Excel中参数开始列索引

    #self.argcount =8 #Excel中支持的参数个数

    class create_excel:

    def __init__(self, sFile, dtitleindex=3, dcasebegin=4, dargbegin=3, dargcount=8):

    self.xlApp = win32com.client.Dispatch('et.Application') #MS:Excel WPS:et

    try:

    self.book = self.xlApp.Workbooks.Open(sFile)

    except:

    print_error_info()

    print "打开文件失败"

    exit()

    self.file=sFile

    self.titleindex=dtitleindex

    self.casebegin=dcasebegin

    self.argbegin=dargbegin

    self.argcount=dargcount

    self.allresult=[]

    self.retCol=self.argbegin+self.argcount

    self.xmlCol=self.retCol+1

    self.resultCol=self.xmlCol+1

    def close(self):

    #self.book.Close(SaveChanges=0)

    self.book.Save()

    self.book.Close()

    #self.xlApp.Quit()

    del self.xlApp

    def read_data(self, iSheet, iRow, iCol):

    try:

    sht = self.book.Worksheets(iSheet)

    sValue=str(sht.Cells(iRow, iCol).Value)

    except:

    self.close()

    print('读取数据失败')

    exit()

    #去除'.0'

    if sValue[-2:]=='.0':

    sValue = sValue[0:-2]

    return sValue

    def write_data(self, iSheet, iRow, iCol, sData, color=OK_COLOR):

    try:

    sht = self.book.Worksheets(iSheet)

    sht.Cells(iRow, iCol).Value = sData.decode("utf-8")

    sht.Cells(iRow, iCol).Interior.Color=color

    self.book.Save()

    except:

    self.close()

    print('写入数据失败')

    exit()

    #获取用例个数

    def get_ncase(self, iSheet):

    try:

    return self.get_nrows(iSheet)-self.casebegin+1

    except:

    self.close()

    print('获取Case个数失败')

    exit()

    def get_nrows(self, iSheet):

    try:

    sht = self.book.Worksheets(iSheet)

    return sht.UsedRange.Rows.Count

    except:

    self.close()

    print('获取nrows失败')

    exit()

    def get_ncols(self, iSheet):

    try:

    sht = self.book.Worksheets(iSheet)

    return sht.UsedRange.Columns.Count

    except:

    self.close()

    print('获取ncols失败')

    exit()

    def del_testrecord(self, suiteid):

    try:

    #为提升性能特别从For循环提取出来

    nrows=self.get_nrows(suiteid)+1

    ncols=self.get_ncols(suiteid)+1

    begincol=self.argbegin+self.argcount

    #提升性能

    sht = self.book.Worksheets(suiteid)

    for row in range(self.casebegin, nrows):

    for col in range(begincol, ncols):

    str=self.read_data(suiteid, row, col)

    #清除实际结果[]

    startpos = str.find('[')

    if startpos>0:

    str = str[0:startpos].strip()

    self.write_data(suiteid, row, col, str, OK_COLOR)

    else:

    #提升性能

    sht.Cells(row, col).Interior.Color = OK_COLOR

    #清除TestResul列中的测试结果,设置为NT

    self.write_data(suiteid, row, self.argbegin+self.argcount+1, ' ', OK_COLOR)

    self.write_data(suiteid, row, self.resultCol, 'NT', NT_COLOR)

    except:

    self.close()

    print('清除数据失败')

    exit()

    #执行调用

    def HTTPInvoke(IPPort, url):

    conn = httplib.HTTPConnection(IPPort)

    conn.request("GET", url)

    rsps = conn.getresponse()

    data = rsps.read()

    conn.close()

    return data

    #获取用例基本信息[Interface,argcount,[ArgNameList]]

    def get_caseinfo(Data, SuiteID):

    caseinfolist=[]

    sInterface=Data.read_data(SuiteID, 1, 2)

    argcount=int(Data.read_data(SuiteID, 2, 2))

    #获取参数名存入ArgNameList

    ArgNameList=[]

    for i in range(0, argcount):

    ArgNameList.append(Data.read_data(SuiteID, Data.titleindex, Data.argbegin+i))

    caseinfolist.append(sInterface)

    caseinfolist.append(argcount)

    caseinfolist.append(ArgNameList)

    return caseinfolist

    #获取输入

    def get_input(Data, SuiteID, CaseID, caseinfolist):

    sArge=''

    #参数组合

    for j in range(0, caseinfolist[1]):

    if Data.read_data(SuiteID, Data.casebegin+CaseID, Data.argbegin+j) != "None":

    sArge=sArge+caseinfolist[2][j]+'='+Data.read_data(SuiteID, Data.casebegin+CaseID, Data.argbegin+j)+'&'

    #去掉结尾的&字符

    if sArge[-1:]=='&':

    sArge = sArge[0:-1]

    sInput=caseinfolist[0]+sArge #组合全部参数

    return sInput

    #结果判断

    def assert_result(sReal, sExpect):

    sReal=str(sReal)

    sExpect=str(sExpect)

    if sReal==sExpect:

    return 'OK'

    else:

    return 'NG'

    #将测试结果写入文件

    def write_result(Data, SuiteId, CaseId, resultcol, *result):

    if len(result)>1:

    ret='OK'

    for i in range(0, len(result)):

    if result[i]=='NG':

    ret='NG'

    break

    if ret=='NG':

    Data.write_data(SuiteId, Data.casebegin+CaseId, resultcol,ret, NG_COLOR)

    else:

    Data.write_data(SuiteId, Data.casebegin+CaseId, resultcol,ret, OK_COLOR)

    Data.allresult.append(ret)

    else:

    if result[0]=='NG':

    Data.write_data(SuiteId, Data.casebegin+CaseId, resultcol,result[0], NG_COLOR)

    elif result[0]=='OK':

    Data.write_data(SuiteId, Data.casebegin+CaseId, resultcol,result[0], OK_COLOR)

    else: #NT

    Data.write_data(SuiteId, Data.casebegin+CaseId, resultcol,result[0], NT_COLOR)

    Data.allresult.append(result[0])

    #将当前结果立即打印

    print 'case'+str(CaseId+1)+':', Data.allresult[-1]

    #打印测试结果

    def statisticresult(excelobj):

    allresultlist=excelobj.allresult

    count=[0, 0, 0]

    for i in range(0, len(allresultlist)):

    #print 'case'+str(i+1)+':', allresultlist[i]

    count=countflag(allresultlist[i],count[0], count[1], count[2])

    print 'Statistic result as follow:'

    print 'OK:', count[0]

    print 'NG:', count[1]

    print 'NT:', count[2]

    #解析XmlString返回Dict

    def get_xmlstring_dict(xml_string):

    xml = XML2Dict()

    return xml.fromstring(xml_string)

    #解析XmlFile返回Dict

    def get_xmlfile_dict(xml_file):

    xml = XML2Dict()

    return xml.parse(xml_file)

    #去除历史数据expect[real]

    def delcomment(excelobj, suiteid, iRow, iCol, str):

    startpos = str.find('[')

    if startpos>0:

    str = str[0:startpos].strip()

    excelobj.write_data(suiteid, iRow, iCol, str, OK_COLOR)

    return str

    #检查每个item (非结构体)

    def check_item(excelobj, suiteid, caseid,real_dict, checklist, begincol):

    ret='OK'

    for checkid in range(0, len(checklist)):

    real=real_dict[checklist[checkid]]['value']

    expect=excelobj.read_data(suiteid, excelobj.casebegin+caseid, begincol+checkid)

    #如果检查不一致测将实际结果写入expect字段,格式:expect[real]

    #将return NG

    result=assert_result(real, expect)

    if result=='NG':

    writestr=expect+'['+real+']'

    excelobj.write_data(suiteid, excelobj.casebegin+caseid, begincol+checkid, writestr, NG_COLOR)

    ret='NG'

    return ret

    #检查结构体类型

    def check_struct_item(excelobj, suiteid, caseid,real_struct_dict, structlist, structbegin, structcount):

    ret='OK'

    if structcount>1: #传入的是List

    for structid in range(0, structcount):

    structdict=real_struct_dict[structid]

    temp=check_item(excelobj, suiteid, caseid,structdict, structlist, structbegin+structid*len(structlist))

    if temp=='NG':

    ret='NG'

    else: #传入的是Dict

    temp=check_item(excelobj, suiteid, caseid,real_struct_dict, structlist, structbegin)

    if temp=='NG':

    ret='NG'

    return ret

    #获取异常函数及行号

    def print_error_info():

    """Return the frame object for the caller's stack frame."""

    try:

    raise Exception

    except:

    f = sys.exc_info()[2].tb_frame.f_back

    print (f.f_code.co_name, f.f_lineno)

    #测试结果计数器,类似Switch语句实现

    def countflag(flag,ok, ng, nt):

    calculation = {'OK':lambda:[ok+1, ng, nt],

    'NG':lambda:[ok, ng+1, nt],

    'NT':lambda:[ok, ng, nt+1]}

    return calculation[flag]()

    2、项目测试代码

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

    #****************************************************************

    # xxx_server_case.py

    # Author : Vince

    # Version : 1.0

    # Date : 2011-3-10

    # Description: 内容服务系统测试代码

    #****************************************************************

    from testframe import *

    from common_lib import *

    httpString='http://xxx.com/xxx_product/test/'

    expectXmldir=os.getcwd()+'/TestDir/expect/'

    realXmldir=os.getcwd()+'/TestDir/real/'

    def run(interface_name, suiteid):

    print '【'+interface_name+'】' + ' Test Begin,please waiting...'

    global expectXmldir, realXmldir

    #根据接口名分别创建预期结果目录和实际结果目录

    expectDir=expectXmldir+interface_name

    realDir=realXmldir+interface_name

    if os.path.exists(expectDir) == 0:

    os.makedirs(expectDir)

    if os.path.exists(realDir) == 0:

    os.makedirs(realDir)

    excelobj.del_testrecord(suiteid) #清除历史测试数据

    casecount=excelobj.get_ncase(suiteid) #获取case个数

    caseinfolist=get_caseinfo(excelobj, suiteid) #获取Case基本信息

    #遍历执行case

    for caseid in range(0, casecount):

    #检查是否执行该Case

    if excelobj.read_data(suiteid,excelobj.casebegin+caseid, 2)=='N':

    write_result(excelobj, suiteid, caseid, excelobj.resultCol, 'NT')

    continue #当前Case结束,继续执行下一个Case

    #获取测试数据

    sInput=httpString+get_input(excelobj, suiteid, caseid, caseinfolist)

    XmlString=HTTPInvoke(com_ipport, sInput) #执行调用

    #获取返回码并比较

    result_code=et.fromstring(XmlString).find("result_code").text

    ret1=check_result(excelobj, suiteid, caseid,result_code, excelobj.retCol)

    #保存预期结果文件

    expectPath=expectDir+'/'+str(caseid+1)+'.xml'

    #saveXmlfile(expectPath, XmlString)

    #保存实际结果文件

    realPath=realDir+'/'+str(caseid+1)+'.xml'

    saveXmlfile(realPath, XmlString)

    #比较预期结果和实际结果

    ret2= check_xmlfile(excelobj, suiteid, caseid,expectPath, realPath)

    #写测试结果

    write_result(excelobj, suiteid, caseid, excelobj.resultCol, ret1, ret2)

    print '【'+interface_name+'】' + ' Test End!'

    3、测试入口

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

    #****************************************************************

    # main.py

    # Author : Vince

    # Version : 1.0

    # Date : 2011-3-16

    # Description: 测试组装,用例执行入口

    #****************************************************************

    from testframe import *

    from xxx_server_case import *

    import xxx_server_case

    #产品系统接口测试

    #设置测试环境

    xxx_server_case.excelobj=create_excel(os.getcwd()+'/TestDir/xxx_Testcase.xls')

    xxx_server_case.com_ipport=xxx.com'

    #Add testsuite begin

    run("xxx_book_list", 4)

    #Add other suite from here

    #Add testsuite end

    statisticresult(xxx_server_case.excelobj)

    xxx_server_case.excelobj.close()

    希望本文所述对大家Python程序设计有所帮助。

    展开全文
  • Time will tell.1、什么是性能自动化测试?性能:系统负载能力超负荷运行下的稳定性系统瓶颈自动化测试:使用程序代替手工提升测试效率性能自动化:使用代码模拟大批量用户让用户并发请求多页面多用户并发请求采集...

    Time will tell.

    1、什么是性能自动化测试?

    性能:

    系统负载能力

    超负荷运行下的稳定性

    系统瓶颈

    自动化测试:

    使用程序代替手工

    提升测试效率

    性能自动化:

    使用代码模拟大批量用户

    让用户并发请求

    多页面多用户并发请求

    采集参数,统计系统负载能力

    生成报告

    2、Python中的性能自动化测试库

    locust库

    使用Python

    使用代码来创建批量用户

    分布式

    可以在多台服务器上,进行分布式性能测试

    可伸缩性强

    稳定、应用广泛

    经得住各种场景下的考验

    基于web ui界面展示测试详情

    能测任何系统

    3、基础操作

    1、安装locust

    ◆ 使用官方pypi源来安装

    pip install locustio

    ◆ 使用豆瓣pypi源来安装(推荐)

    pip install -i https://pypi.douban.com/simple locustio

    安装成功之后,在cmd控制台将会新增一条命令,可输入如下命令查看:

    locust --help

    2、基本用法

    在项目根目录下创建locustfile.py文件

    ◆ 执行性能测试

    运行之后,控制台会在本地监听一个端口

    a. 程序文件要命名为locustfile.py才行

    b. 假如命名为one_example.py,则需要这样运行

    locust -f one_example.py

    ◆ 在浏览器打开UI设置界面

    默认使用localhost:8089打开

    4、综合案例演练

    1、编写自动化测试脚本

    在项目根目录下创建test_load.py文件

    2、使用命令行运行

    打开Pycharm Terminal控制台,运行如下命令:

    注意:–host参数指定http主机地址,-f参数指定压测程序文件名

    3、打开web ui界面进行配置

    设置并发用户数为10,每5秒创建一个用户

    压测过程截图

    美轮美奂的压测报告

    压测失败详情

    下载压测统计数据

    下载的压测统计数据csv文件

    5、总结

    locust做压测功能极其强大

    支持分布式部署

    提供的接口简单

    压测代码非常容易编写

    提供UI界面来配置

    美观、详细的图表统计

    絮叨

    如果你处于想学Python自动化或正在学习Python自动化中,Python自动化的教程不少了,但不一定是最新的,说不定你学的是别人一年前就学过的内容。干货分享一波!2020最新的Python教程。获取方式,加175317069私信Q群管理即可免费获取。

    喜欢的话,欢迎【评论】、【点赞】、【关注】礼貌三连

    Time will tell.(时间会证明一切)

    内容来源于网络如有侵权请私信删除

    展开全文
  • 但领导目前注重先把专项测试方面完成,借此,先暂停python+rf(主要是与Jenkins集成+导入DB+微信告警)接口自动化,且目前个人觉得前面讲解的python+rf可以说基本完成了接口自动化测试前期和后续的核心工作了,转而...
  • 本文将从一个测试人员的角度对PHP官方的自动化测试方法自动化测试框架结构,以及具体的实现进行分析和研究。通过实际的例子,向读者展示PHP是如何实现有效的自动化测试以保证其代码高质量的。读者通过阅读本文,...
  • 主要介绍了python接口自动化测试之接口数据依赖的实现方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
  • 自动化测试方法改进方案 软件测试 一、前言 自动化测试是测试领域中一个争议性比较大的区域,虽然它并不是一个新生的事物,但是至今仍没有一套比较完善的理论可以提供行之有效的方法,使之更好的为产品质量服务。...
  • 接口测试方法–全网最全详解 1. 测试工具:jmeter、postman 2. 使用代码创建接口测试框架 excel 存放用例测试数据 unittest + ddt 数据驱动,测试数据与测试代码分离 自定义日志模块 配置文件 pymysql 与金额相关...
  • SNMP接口信息模型自动化测试方法研究与实现,刘益畅,陈颖慧,SNMP接口信息模型测试是一项复杂且繁重的工作,仅靠人工手动测试不但效率低下,而且测试质量有可能受到测试人员的知识结构、态度��
  • 自动化测试,个人以为,很重要的两个方面:一是能够做到无人值守的情况,自动化测试过程能够顺利进行。二是能够做到有详细的结果报告。将其具体在细节上分,则有几个...接下来,结合RFT来从技术实现上说明自动化测试
  • 自动化测试流程

    2018-12-01 15:28:50
    2.自动化测试实现方法分析: 用什么工具?还是自主研发? 3.自动化测试成本分析: 领导考虑的,不用管 4.自动化测试设计: 要用框架吗?效率是最重要的 最流行的有:数据驱动,关键字框架,【惠普里有个BTP的...
  • 熟悉单元测试的同学都知道在测试用例中,执行完测试用例后,通过断言(assert)判断测试结果是pass还是fail。不同的单元测试框架都提供了断言机制,我们这里以python为例进行说明。Python中的断言类型丰富,最常用的...
  • 官方浅析浅析PHP官方自动化测试方法(上)软件测试本文将从一个测试人员的角度对PHP官方的自动化测试方法自动化测试框架结构,以及具体的实现进行分析和研究。通过实际的例子,向读者展示PHP是如何实现有效的自动化...
  • 最初采用自动化测试的目的是为了进行回归测试:因为自动化测试能够在测试用例执行方面大幅度的降低成 实现基于自动化测试框架Framework的构建 软件测试 随着对软件质量的要求越来越高,测试也越来越被重视。...
  • 本文给出了无线设备自动测试的...系统实现了广东电信规定的PHS干放所有技术指标的自动化测试功能,并且系统稍加改动即可实现CDMA干放技术指标的自动测试任务,同时对无线网络直放站的自动测试实现也有一定的参考意义。
  • 软件自动化测试项目也像普通的软件开发项目一样,有编码阶段,自动化测试的编码阶段主要是编写测试脚本实现所设计的自动化测试用例。自动化功能测试脚本地开发方法主要有以下几种:1.线性的2.结构化的3.共享的4.数据...
  • python实现接口自动化测试 课程大纲介绍 ...2.了解接口自动化测试实现方法 1.接口自动化测试 1.1概念 接口测试:是对系统或组件之间的接口进行测试,主要是校验数据的交换、传递和控制管理过程,以及相
  • 使用IBMRationalFunctionalTester实现全球化应用的自动化测试 软件测试 本文内容包括: 前提条件 测试自动化概述 全球化测试自动化遇到的典型问题 全球化应用程序的自动测试是如何工作的 全球化应用程序的...
  • 在做自动化测试时,经常会对一整套业务流程进行一组接口上的测试,这时候接口之间经常会有数据依赖,那么具体要怎么实现这个依赖呢。思路如下:抽取之前接口的返回值存储到全局变量字典中。初始化接口请求时,解析...
  •  本文结合自动化测试框架、创建运行控制点、实现运行控制机制等技术,设计了一套面向行业应用的自动化测试运行控制方法,很好地解决了自动化测试中面临的脚本运行控制问题。 1自动化测试流程 1.1自动化测试  ...
  • 主要为大家详细介绍了python unittest实现api自动化测试方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
  • (2):config目录主要放置配置文件信息,包含:数据库连接配置、UI自动化脚本中所需的页面元素信息及app启动信息、自动化报告邮件发送配置信息、接口请求的对应的url信息等【大家可根据待测app的功能添加或减少配置...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 4,267
精华内容 1,706
关键字:

自动化测试实现方法