“天街小雨润如酥,草色遥看近却无。最是一年春好处,绝胜烟柳满皇都。”读一首古诗,心情也随之平静下来

发布新日志

  • Selenium WebDriver在不知道元素个数的情况下,完成页面所有元素的遍历

    2013-10-14 16:50:56

    以一个选择企业页面为例,假设事先并不知道用户登录后会有几个企业供选择,但是case又需要遍历各个企业,保证各个企业均可正常被访问,那么就可以用红色标记的方式处理。

    public class ChooseEnterprise {
    private WebDriver driver;
    private String baseUrl;
    private StringBuffer verificationErrors = new StringBuffer();

    @Before
    public void setUp() throws Exception {
    System.setProperty("webdriver.ie.driver", "C:\\Program Files (x86)\\Internet Explorer\\IEDriverServer.exe");
    driver = new InternetExplorerDriver();
    baseUrl = "http://xx.xxx.cn/";
    driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
    }

    @Test
    public void testChooseEnterprise() throws Exception {

    int i = 1;
    int j = 1;
    String str = "";
    String strLast = "";

    //因为不知道需要打开的链接一共有多少个,所以使用while循环,始终给一个真值,直到条件满足跳出循环
    while(i!=0){


    driver.get(baseUrl + "xx/xx/login.jsp");

    //判断是否成功进入登录页面
    try {
    assertEquals("使用手机帐号登录", driver.findElement(By.cssSelector("span.fontred2")).getText());
    } catch (Error e) {
    verificationErrors.append(e.toString());
    }

    driver.findElement(By.id("usersPhone")).clear();
    driver.findElement(By.id("usersPhone")).sendKeys("13800000000");

    driver.findElement(By.id("usersPassword")).clear();
    driver.findElement(By.id("usersPassword")).sendKeys("123456");

    driver.findElement(By.cssSelector("img")).click();

    //判断是否到达选择企业页面
    try {
    assertEquals("选择企业", driver.findElement(By.xpath("//h3")).getText());
    } catch (Error e) {
    verificationErrors.append(e.toString());
    }

    //获取属性为class=qy_bg的div元素的值

    str = driver.findElement(By.xpath("(//div[@class='qy_bg'])["+i+"]")).getText();

    //获取属性为class=qy_bg的div最后一个元素的值
    strLast = driver.findElement(By.xpath("(//div[@class='qy_bg'])[last()]")).getText();

    driver.findElement(By.xpath("(//a[contains(text(),'"+str+"')])")).click();



    //判断是否进入各企业主页
    try {
    assertEquals(str, driver.findElement(By.xpath("//p[2]")).getText());
    } catch (Error e) {
    verificationErrors.append(e.toString());
    }

    //点击进入个人中心的图标,进行退出操作
    driver.findElement(By.cssSelector("div.r_sz > a > img")).click();
    //检查是否了进入个人中心
    try {
    assertEquals("个人中心", driver.getTitle());
    } catch (Error e) {
    verificationErrors.append(e.toString());
    }
    //点击退出
    driver.findElement(By.linkText("退 出")).click();
    //检查是否成功退出
    try {
    assertEquals("欢迎登录网信", driver.findElement(By.cssSelector("p.fontred")).getText());
    } catch (Error e) {
    verificationErrors.append(e.toString());
    }

    //j可以统计出一共有多少个企业,供测试结果输出使用
    j = i;

    System.out.println(j);
    System.out.println(str);

    //当str的值等于strLast,表示已经到达最后一个链接,此时可跳出循环
    if(strLast.equalsIgnoreCase(str)){
    break;
    }


    i++;
    }

    }

    @After
    public void tearDown() throws Exception {
    driver.quit();
    }
    }

  • Maven+Eclipse+Tomcat配置详解(二)

    2013-03-13 11:58:12

    <!--[if !supportLists]-->1.       <!--[endif]-->MyEclipse中配置tomcat注意:tomcat server必须选择为Enable,否则不可用

    <!--[if !vml]--><!--[endif]-->(图19

     

    ------------------------------------------------------------4.示例------------------------------------------------------------

     

    <!--[if !supportLists]-->1.       <!--[endif]-->现在就使用上面的配置创建我们的第一个maven webapp工程吧,打开MyEclipseFile->New->Others->Maven->Maven Project

    <!--[if !vml]--><!--[endif]-->(图20

    <!--[if !vml]--><!--[endif]-->(图21

    CatalogAll Catalogsmabaen-archetype-webapp

    <!--[if !vml]--><!--[endif]-->(图22

    Group Id Artifact IdVersion都是Maven的几个关键元素,这三个元素定义了项目的基本坐标,Maven的世界,任何的jarpom或者war都是以基于这些基本的坐标进行区分的

     

    groupId定义了项目属于哪个组(可以理解为项目的package),artifactId定义了当前Maven项目在组中唯一的ID可以理解为项目名称),version指定了项目当前的版本。

     

    <!--[if !vml]--><!--[endif]-->(图23

    <!--[if !supportLists]-->2.       <!--[endif]-->了解MyEclipse中项目的结构,web项目必须在src\main\webapps下面才可以成功编译和部署。

    <!--[if !vml]--><!--[endif]-->(图24

    <!--[if !supportLists]-->3.       <!--[endif]-->修改index文件,做一个简单的标示。成功运行项目后,页面将显示为如下信息

    <!--[if !vml]--><!--[endif]-->(图25

    <!--[if !supportLists]-->4.       <!--[endif]-->pom.xml文件是maven的核心(pomProject Object Model),在该文件中可以加载任何项目所需的插件,系统会自动将这些项目所需的插件从maven repository center下载下来。因为要希望把项目部署到外部tomcat下面,所以此处需要加入tomcat-maven插件,以及希望启动的tomcat配置

             <plugins>

            <plugin>

                <groupId>org.apache.tomcat.maven</groupId>

                <artifactId>tomcat6-maven-plugin</artifactId>

                <version>2.0-beta-1</version>

               <configuration>

                  <url>http://localhost:6080/manager</url>

                  <server>tomcat6</server>

                  <port>6080</port>

                  <path>/MyFirstMaven</path>

               </configuration>

           </plugin>

       </plugins> <!--[if !vml]--><!--[endif]-->(图26

     

    <!--[if !supportLists]-->5.       <!--[endif]-->运行工程,选择工程名邮件Run As->maven clean,会将之前编译的内容清除重新编译。

    <!--[if !vml]--><!--[endif]-->(图27

    然后执行maven bulid,并在goals中输入package tomcat6:deploy

    <!--[if !vml]--><!--[endif]-->(图28

    先查看一下(图28run之前tomcat\webapps目录下的内容

    <!--[if !vml]--><!--[endif]-->(图29

    Run(图28),当MyEclipse中的console控制台输出的内容为BUILD SUCCESS时,就表示部署成功了

    <!--[if !vml]--><!--[endif]-->(图30

    (图28Run之后tomcat\webapps目录下的内容,多了MyFirstMavenMyFirstMaven.war两个文件,表示项目发布成功

    <!--[if !vml]--><!--[endif]-->(图31

     

    MyEclipse->项目右键->Run As->Maven Build,输入tomcat6:run,就可启动tomcat

    <!--[if !vml]--><!--[endif]-->(图32

    出现如下信息表示tomcat启动成功

    <!--[if !vml]--><!--[endif]-->(图33

    在浏览器中输入http://localhost:6080/MyFirstMaven并访问

    <!--[if !vml]--><!--[endif]-->(图34

    Okmaven webapp项目实例完成。

     

     

    ------------------------------------------------5.问题解答--------------------------------------------------------

     

    maven build工程的时候,大多数资料都是显示tomcat:deploy等等,于是一开始也是按照tomcat:deploy格式输入的,结果会产生大量的报错,而且启动的tomcat端口是8080,是eclipse自带的tomcat,而不是我们设置的6080端口的tomcat。错误信息如下:

    [DEBUG]   (f) charset = ISO-8859-1

    [DEBUG]   (f) contextFile = D:\eclipse\workspaces\MyFirstMaven\target\MyFirstMaven\META-INF\context.xml

    [DEBUG]   (f) ignorePackaging = false

    [DEBUG]   (f) mode = war

    [DEBUG]   (f) packaging = war

    [DEBUG]   (f) path = /MyFirstMaven

    [DEBUG]   (f) update = false

    [DEBUG]   (f) url = http://localhost:8080/manager

    [DEBUG]   (f) version = 1.1

    [DEBUG]   (f) warFile = D:\eclipse\workspaces\MyFirstMaven\target\MyFirstMaven.war

    [DEBUG] -- end configuration --

    [INFO] Deploying war to http://localhost:8080/MyFirstMaven 

    [DEBUG] No server specified for authentication - using defaults

    [INFO] ------------------------------------------------------------------------

    [INFO] BUILD FAILURE

    [INFO] ------------------------------------------------------------------------

    [INFO] Total time: 2.797s

    [INFO] Finished at: Wed Mar 13 11:24:37 CST 2013

    [INFO] Final Memory: 6M/12M

    [INFO] ------------------------------------------------------------------------

    [ERROR] Failed to execute goal org.codehaus.mojo:tomcat-maven-plugin:1.1:deploy (default-cli) on project MyFirstMaven: Cannot invoke Tomcat manager: Server returned HTTP response code: 400 for URL: http://localhost:8080/manager/deploy?path=%2FMyFirstMaven&war= -> [Help 1]

    org.apache.maven.lifecycle.LifecycleExecutionException: Failed to execute goal org.codehaus.mojo:tomcat-maven-plugin:1.1:deploy (default-cli) on project MyFirstMaven: Cannot invoke Tomcat manager

        at org.apache.maven.lifecycle.internal.MojoExecutor.execute

  • Maven+Eclipse+Tomcat配置详解(一)

    2013-03-13 11:52:53

    Maven+Eclipse+Tomcat配置详解

     

    前言:本文介绍的内容都是基于JDK配置ok的情况下进行的,JDK的配置在此不做描述。

     

    ------------------------------------------------1.Maven的配置--------------------------------------------------------

     

    1.       下载maven,此处使用apache-maven-3.0.5版本,下载地址:

    http://maven.apache.org/docs/3.0.5/release-notes.html

    2.       解压apache-maven-3.0.5D:\eclipse\

    (图1

    3.       拷贝apache-maven-3.0.5/conf/settings.xml

    C:\Documents and Settings\Administrator\.m2

    (图2

     

    说明:如果setting.xml放置到maven/conf下面相当于全局变量,其修改会影响所有使用maven的人,放置到Administrator\.m2下面是针对某个用户Administrator而言,起修改仅会影响到该用户

    4.       修改C:\Documents and Settings\Administrator\.m2\settings.xml

    (1)     修改maven本地资源库的配置,以后maven用到的所有资源文件都会存储到该目录下:

    <localRepository>D:\eclipse\apache-maven-local-repository</localRepository>

    (图3

    (图4

    (2)     再说一说settings.xml 文件中与tomcat相关的配置,以备后面集成使用,此步骤可暂缓进行,此处只是为了文档完整性而作。<id>标签可以理解为tomcat别名,比如本人使用的是apache-tomcat-6.0.36,那<id>标签中的内容为tomcat6记住这个别名,很重要的,后面的pom.xml配置,以及eclipsemaven build中都会用到),<username><password>标签内容对应apache-tomcat-6.0.36\conf\tomcat-users.xml中设置的用户名和密码。(此步骤可在配置完tomcat以后再配置

    <server>

          <id>tomcat6</id>

          <username>admin</username>

          <password>admin</password>

        </server>(图5

    5.           配置环境变量MAVEN_HOME MAVEN_HOME=D:\eclipse\apache-maven-3.0.5注意,路径最后不要加\,如果加了\,那后面path读出来的变量名称就是D:\eclipse\apache-maven-3.0.5\\bin,显然是错误的

    (图6

    6.       配置环境变量path:在path里面添加%MAVEN_HOME%\bin; 注意,英文状态下的分号;不能少

    (图7

    环境变量配置好以后,在cmd里输入mvn –version,如果出现下图信息,表示配置成功。

    (图8

     

    至此,maven的配置完成。

     

    ------------------------------------------------2.Tomcat的配置--------------------------------------------------------

     

    1.       下载tomcat,可到apache官网http://tomcat.apache.org/download-60.cgi

    2.       解压apache-tomcat-6.0.36D:\eclipse\

    (图9

    3.       修改tomcat的配置D:\eclipse\apache-tomcat-6.0.36\conf,首先修改server.xmltomcat默认端口是8080,为防止端口冲突,将8080修改为6080

    <Connector port="6080" protocol="HTTP/1.1"

                   connectionTimeout="20000"

                   redirectPort="8443" />

    (图10

    4.       然后修改D:\eclipse\apache-tomcat-6.0.36\conf\tomcat-users.xml,为tomcat配置管理员账号

    <user username="admin" password="admin" roles="manager"/>

    (图11

    5.       修改完tomcat的配置后进入D:\eclipse\apache-tomcat-6.0.36\binstartup.bat启动tomcat,在地址栏里输入:http://localhost:6080/manager/html,弹出用户名和密码输入框,输入第4步骤设置的用户名和密码。

    (图12

    登录成功后进入tomcat管理页面,表示tomcat配置成功

    (图13

    至此,tomat配置完成。

    ------------------------------------------------3.Eclipse的配置--------------------------------------------------------

     

    1.       安装EclipseMyEclipse,可到官网下载

    (图14

    2.       启动MyEclipse,进入help->MyEclipse Configuration Center

    (图15

    3.       进入Center中心后切换到SoftWare标签,一般高版本的MyEclipse会自带Maven插件,可先通过My SoftWare中卸载Maven插件,然后再在Browser SoftWare中通过add site添加m2eclipse

    Mavenhttp://download.eclipse.org/technology/m2e/releases

    最后通过Pending Changes中的【Apply 1 change 】安装插件,中间可能会需要多次重启MyEclipse

    (图16

    4.       MyEclipseMaven插件安装完成后,在window->preference中会看到Maven插件,然后就是对Maven进行配置,首先是Installations,需要将本地的Maven添加进来D:\eclipse\apache-maven-3.0.5,并且配置好Global Setting

    (图17

    然后再配置User Settings

    (图18


  • LoadRunner 中的 Unique Number 参数类型 --- (一)

    2009-02-02 14:14:35

    引言:

    我们在测试过程中经常会遇到批量添加数据的情况,并且这些数据很多时候是具有唯一性的。

    比如说当前项目中需要创建一个添加用户的脚本,这些用户都是唯一的,当时采取的是创建file类型的参数,将参数用excel拖曳下来(tester001-tester1000)保存成dat类型的文档,如果参数数量很小这种方案也还算切实可行,但是如果遇到成百上千万的数据,再用这种方式就非常的吃力,势必会浪费大量的人力物力,也就达不到节约资源、降低成本的目的。

    再比如前段时间性能测试中就有一个对数据库的容量和处理能力的验证,主要是通过页面新建用户向数据库中添加数据。在这些需要添加的数据中,email字段要求必须是唯一的。因为需要插入大批量的数据,再使用上面的file类型的文件来参数化就非常困难了。当时的解决方案有两种:一种是使用for循环,再一种是用当前的系统时间,具体到时分秒作为参数处理。使用for循环,可能仅仅只有一个字段需要取唯一值,但是却要循环整个业务,这样势必造成资源的浪费,而且执行效率也不高,进而影响性能测试的准确性。

    简介:

    从引言中可以看到,参数的处理方式可以多种多样,今天主要介绍Unique Number类型的参数。参数的创建方式跟file类型的一样,在此就不多做赘述。下面主要结合场景看一下Unique Number参数类型的特性,该类型主要包括数据的范围(Number range)、示例(Sample value)、数据格式(Number format)、更新参数的方式(Update value on)、异常情况下的处理(When out of values)

         (------图片稍候上传------)

    如上图设置,就表示从001开始取值,每个用户有5个值,按照迭代的方式更新参数,如果参数不够就从第一个值(001)开始取:

    如果有5个用户并发,每个用户迭代10次,第一个用户取值为001002003004005001002003004005,第二个用户为006007008009010006007008009010,以此类推,具体可根据实例在场景中执行查看。

    实例:

    Unique Number参数类型实例:

    /*************************************************

     * Unique Number类型对唯一性的数据进行参数化,

     * 并且计算该方法所耗费的时间                                      

    **************************************************/

    Action()

    {

        double time_elapsed;

        merc_timer_handle_t timer;

        char fullname[1024] =  "tester";

     

        timer = lr_start_timer();

     

        strcat(fullname,lr_eval_string("{memberID}"));

        lr_log_message("The running username is --- %s:",fullname);

     

        time_elapsed = lr_end_timer(timer);

        lr_log_message("===%lf===",time_elapsed);

     

        lr_log_message("memberID:%s",lr_eval_string("{memberID}"));

        return 0;

    }

    For循环实例:

    /***********************************************

     * for循环对唯一性的数据进行参数化,

     * 并且计算该方法所耗费的时间                                      

    ************************************************/

    Action()

    {

        double time_elapsed;

        merc_timer_handle_t timer;

        char fullname[1024] =  "tester";

        char str[10];

        int i;

     

        timer = lr_start_timer();

     

        for(i=0;i<5;i++){

           itoa(i,str,10);

            strcat(fullname,str);

            lr_log_message("The running username is --- %s:",fullname);

            strcpy(fullname,"tester");

        }

     

        time_elapsed = lr_end_timer(timer);

        lr_log_message("===%lf===",time_elapsed);

     

        return 0;

    }

    取系统时间作为参数的实例:

    /********************************************

     * 取系统时间对唯一性的数据进行参数化,

     * 并且计算该方法所耗费的时间                                      

    *********************************************/

    Action()

    {

        double time_elapsed;

        merc_timer_handle_t timer;

        char fullname[1024] ="tester";

     

        timer = lr_start_timer();

     

        lr_save_datetime("%Y%m%d%H%M%S", DATE_NOW+TIME_NOW,"mydates");

        strcat(fullname,lr_eval_string("{mydates}"));

        lr_log_message("The running username is --- %s:",fullname);

     

        time_elapsed = lr_end_timer(timer);

        lr_log_message("===%lf===",time_elapsed);

     

        return 0;

    }

  • LoadRunner 中的 Unique Number 参数类型 --- (二)

    2009-02-02 14:03:11

    LoadRunner 中的 Unique Number 参数类型 (续)

     

    验证:

    现在就针对这几种参数处理方式的验证结果做一下阐述,Unique Number类型、for循环、用系统时间作为参数。

    从便捷性方面看:

    Unique Number类型的参数创建方式非常简单,只要选中需要参数化的值,右键Replace with a parameter,根据实际需要做相应的设置即可,便于记忆,易于维护。

    For循环:需要编写代码,而且每次执行以后都要查找代码,重新修改循环变量的起始值,方便性可想而知。

    用系统时间作为参数:也需要编写代码,而且必须使用lr_save_datetime()函数特有的格式,如果记忆不深刻的话,每次使用都需要查阅帮助,不是很方便。

    从性能方面看:

    为了查看这三种方式的性能,特地进行了如下试验:

    1、                Unique Number类型作为参数,在该实例中设置5次迭代,每一个场景执行完后取该场景中每次迭代的消耗时间,取时间之和。

    2、                For循环处理参数,循环5次,取该循环总的消耗时间

    3、                用系统时间作为参数,该实例的操作步骤同试验1

    上面3个场景,每个执行5次,取到的测试数据如下:

    Unique Number类型参数

     

    场景一

    场景二

    场景三

    场景四

    场景五

    迭代一

    0.016507

    0.022646

    0.016263

    0.02098

    0.0128

    迭代二

    0.009697

    0.008834

    0.009304

    0.013324

    0.011806

    迭代三

    0.009392

    0.009119

    0.009371

    0.009595

    0.012904

    迭代四

    0.008781

    0.009133

    0.008802

    0.009916

    0.008767

    迭代五

    0.009046

    0.0095

    0.015279

    0.00926

    0.009376

    消耗时
    间总和

    0.053423

    0.059232

    0.059019

    0.063075

    0.055653

     

    For循环:

    消耗时

    间总和

    0.076782

    0.071071

    0.085025

    0.080379

    0.077205

  • LoadRunner 中的 Unique Number 参数类型 --- (三)

    2009-02-02 13:56:58

    LoadRunner 中的 Unique Number 参数类型(续)

     

    取系统时间作为参数:

     

    场景一

    场景二

    场景三

    场景四

    场景五

    迭代一

    0.023591

    0.017908

    0.010141

    0.02521

    0.017241

    迭代二

    0.00989

    0.010288

    0.012148

    0.009862

    0.010312

    迭代三

    0.010657

    0.009689

    0.010065

    0.009892

    0.010261

    迭代四

    0.009867

    0.010119

    0.01023

    0.010229

    0.009717

    迭代五

    0.010608

    0.010473

    0.015352

    0.010075

    0.016587

    消耗时
    间总和

    0.064613

    0.058477

    0.057936

    0.065268

    0.064118

      

    从上面3个表格看,性能最好的要数Unique Number类型的参数方案,其次是取用系统时间作为参数,最后才是使用for循环。

     

    尾声:

    综上所述,当遇到对唯一性数据进行参数化时,使用Unique Number参数类型是一个不错的选择。本文档是在学习Unique Number类型的参数时整理的,或许上述的验证方式不够合理与完善,肯请各位看官给出宝贵的意见和建议,谢谢!

     

     

  • [转贴] 软件测试职业发展的各个阶段

    2007-07-04 10:41:57

    测试专业人士从旁观者的角度看待软件测试职业发展也许能够帮大家看到自己疏忽的一面 .
    这是国外公司的职位分布,国内一些走在前列的公司,也差不多在国内可能晋升要快的多,可能2-3年就走完了国外要15年的路

    初级
    测试工程师

    刚入门的拥有计算机科学学位的
    个人或具有一些手工 测试经验的个人。开发测试脚本并开始熟悉测试生存周期和测试技术

    测试工程师/程序分析员

    具有1-2年经验的测试工程师或程序员。编醋远测试脚本程序并担任测试编程初期的领导
    工作。进一步拓展编程语言、操作系统、网络?A ōnclick="javascrīpt:tagshow(event, '%CA%FD%BE%DD%BF%E2');" href="javascrīpt:;" target=_self>数据库方面的技能

    高级测试工程师/程序分析员

    具有3-4年经验的测试工程师或程序员。帮助开发或维护测试或编程标准与过程,负责同级的评审,并为其它初级的测试工程师或程序员充当顾问。继续拓展编程语言、操作系统、网络与数据库方面的技能

    测试组负责人

    具有4-6年经验的测试工程师或程序员。负责管理1至3名测试工程师或程序员。担负一些进度安排和工作规模/成本估算职责。更集中于技能方面

    测试/编程负责人

    具有6-10年经验的测试工程师或程序员。负责管理8至10名技术人员。负责进度安排、工作规模/成本估算、按进度表和预算目标交付产品。负责开发项目的技术方法。为一些用户提供支持与演示。开发一些特定领域的技术专长

    测试/质量保证/开发(项目)、经理

    具有10多年的工作经验。管理8名或更多的人员参加的1个或多个项目。负责这一领域(测试/质量保证/开发)内的整个开发生存周期业务。为一些用户提供交互和大量演示。负责项目成本、进度安排、计划和人员分工

    计划经理

    具有15年以上开发与支持(测试/质量保证)活动方面的经验。管理从事若干项目的人员以及整个开发生存周期。负责把握项目方向与盈亏责任..
     

Open Toolbar