我希望有很多很多的爱,如果没有很多的爱,我希望有很多很多的钱;没有很多的钱,我希望拥有健康! I am like the road in the night listening to the footfalls of its memories in silence.

发布新日志

  • [转]QTP读取Excel数据的方法

    2008-08-24 16:36:38

         在构建自己的测试框架时,或者是从Excel读入外部数据进行检查时都要用到Excel的COM对象编程方法,下面脚本中的ReadFile函数就实现了这样的功能,首先创建Excel应用程序对象,然后打开Excel文件,把Excel数据读取到一个数组中。


     一、读取函数


    ' 输入:
    '             sFileName: Excel文件
    '             sSheetName:表单名称
    ' 返回:
    '             包含Excel数据的数组
    Function ReadFile(sFileName,sSheetName)
           Dim oExcel
           Dim oSheet
           Dim oRange
           Dim arrRange
     
           On Error Resume Next
               ' 创建Excel应用程序对象
                  Set ōExcel = CreateObject("Excel.Application")
                  If err.Number <> 0 Then
                         MsgBox "未能初始化Excel" & vbCrLf & _
                                     "请确保Excel已安装", vbCritical
                         Exit Function
                  End If
           On Error Goto 0
                        
           On Error Resume Next
                         ' 打开Excel文件
                         oExcel.Workbooks.Open(sFileName)
                      If err.Number <> 0 Then
                                MsgBox "未能加载Excel文件" & vbCrLf & _
                                       "请确保Excel文件路径正确或格式正确", vbCritical
                                Exit Function
                         End If
           On Error Goto 0
          
           ' 获取表格的使用范围
           Set ōSheet = oExcel.Worksheets(sSheetName).UsedRange
           ' 获取从A列到Z列,从第1行到第1000行的范围i中的所有值
           Set ōRange = oSheet.Range("A1:Z1000")
           '把Excel数据转换到数组
           arrRange = oRange.Value
           ' 关闭工作簿
           oExcel.WorkBooks.Item(1).Close
           ' 退出Excel
           oExcel.Quit
           Set ōExcel = Nothing
        ' 返回包含Excel数据的数组
         ReadFile = arrRange
    End Function

    二、调用

    arrRange = ReadFile("D:\QTP\MyWork\ReadExcelFileTest1\ObjectTree.xls","Tree")
    'Msgbox UBound (arrRange,1)
    'Msgbox UBound (arrRange,2)
    ' 读取其中一个单元格的数据
    Msgbox arrRange(3,1)

  • [转] QTP中常有的VB函数

    2007-10-05 19:18:46

    QTP中常有的VB函数

    原文:http://www.51testing.com/?action_viewnews_itemid_20953.html

    Left 函数
            返回 Variant (String),其中包含字符串中从左边算起指定数量的字符。

    语法

    Left(string, length)

    Left 函数的语法有下面的命名参数:

    部分     说明
     
    string  必要参数。字符串表达式其中最左边的那些字符将被返回。如果 string 包含 Null,将返回 Null。
     
    length  必要参数;为 Variant (Long)。数值表达式,指出将返回多少个字符。如果为 0,返回零长度字符串 ("")。如果大于或等于 string 的字符数,则返回整个字符串。
     

    说明

    欲知 string 的字符数,使用 Len 函数。

    注意    LeftB 函数作用于包含在字符串中的字节数据。所以 length 指定的是字节数,而不是要返回的字符数。

    Mid 函数
            从字符串中返回指定数目的字符。

    Mid(string, start[, length])

    参数

    string

            字符串表达式,从中返回字符。如果 string 包含 Null,则返回 Null。

    Start

            string 中被提取的字符部分的开始位置。如果 start 超过了 string 中字符的数目,Mid 将返回零长度字符串 ("")。

    Length

            要返回的字符数。如果省略或 length 超过文本的字符数(包括 start 处的字符),将返回字符串中从 start 到字符串结束的所有字符。

    说明

            要判断 string 中字符的数目,可使用 Len 函数。

            下面的示例利用 Mid 函数返回字符串中从第四个字符开始的六个字符:

    Dim MyVar

    MyVar = Mid("VB脚本is fun!", 4, 6) 'MyVar 包含 "scrīpt"。

    注意   MidB 函数与包含在字符串中的字节数据一起使用。其参数不是指定字符数,而是字节数。

     

    Len 函数
            返回字符串内字符的数目,或是存储一变量所需的字节数。

    Len(string | varname)

    参数

    string

            任意有效的字符串表达式。如果 string 参数包含 Null,则返回 Null。

    Varname

            任意有效的变量名。如果 varname 参数包含 Null,则返回 Null。

    说明

            下面的示例利用 Len 函数返回字符串中的字符数目:

    Dim MyString

    MyString = Len("VBscrīpt") 'MyString 包含 8。

    注意   LenB 函数与包含在字符串中的字节数据一起使用。LenB 不是返回字符串中的字符数,而是返回用于代表字符串的字节数。

     

    Right 函数
            从字符串右边返回指定数目的字符。

    Right(string, length)

    参数

    string

            字符串表达式,其最右边的字符被返回。如果 string 参数中包含 Null,则返回 Null。

    Length

            数值表达式,指明要返回的字符数目。如果为 0,返回零长度字符串;如果此数大于或等于 string 参数中的所有字符数目,则返回整个字符串。

    说明

            要确定 string 参数中的字符数目,使用 Len 函数。

            下面的示例利用 Right 函数从字符串右边返回指定数目的字符:

    Dim AnyString, MyStr

    AnyString = "Hello World"      ' 定义字符串。

    MyStr = Right(AnyString, 1)    ' 返回 "d"。

    MyStr = Right(AnyString, 6)    ' 返回 " World"。

    MyStr = Right(AnyString, 20)   ' 返回 "Hello World"。

    注意   RightB 函数用于字符串中的字节数据,length 参数指定返回的是字节数目,而不是字符数目。

     

    InStr 函数
            返回某字符串在另一字符串中第一次出现的位置。

    InStr([start, ]string1, string2[, compare])

    参数

    start

            可选项。数值表达式,用于设置每次搜索的开始位置。如果省略,将从第一个字符的位置开始搜索。如果 start 包含 Null,则会出现错误。如果已指定 compare,则必须要有 start 参数。

    string1

            必选项。接受搜索的字符串表达式。

    string2

            必选项。要搜索的字符串表达式。

    compare

            可选项。指示在计算子字符串时使用的比较类型的数值。有关数值,请参阅“设置”部分。如果省略,将执行二进制比较。

    设置

            compare 参数可以有以下值:

    常数
     值
     描述
     
    vbBinaryCompare
     0
     执行二进制比较。
     
    vbTextCompare
     1
     执行文本比较。
     

    返回值

    InStr 函数返回以下值:

    如果
     InStr 返回
     
    string1 为零长度
     0
     
    string1 为 Null
     Null
     
    string2 为零长度
     start
     
    string2 为 Null
     Null
     
    string2 没有找到
     0
     
    在 string1 中找到 string2
     找到匹配字符串的位置
     
    start > Len(string2)
     0
     

    说明

    下面的示例利用 InStr 搜索字符串:

    Dim SearchString, SearchChar, MyPos

    SearchString ="XXpXXpXXPXXP"   ' 要搜索的字符串。

    SearchChar = "P"   ' Search for "P".

    MyPos = Instr(4, SearchString, SearchChar, 1)   ' 在位置 4 进行的文本比较。返回 6。

    MyPos = Instr(1, SearchString, SearchChar, 0)   ' 在位置 1 进行的二进制比较。返回 9。

    MyPos = Instr(SearchString, SearchChar)   ' 默认情况下,进行的是二进制比较(省略了最后的参数)。返回 9。

    MyPos = Instr(1, SearchString, "W")   ' 在位置 1 进行的二进制比较。返回 0(找不到 "W")。

    注意   InStrB 函数使用包含在字符串中的字节数据,所以 InStrB 返回的不是一个字符串在另一个字符串中第一次出现的字符位置,而是字节位置。

     

    LTrim、RTrim与 Trim 函数
            返回不带前导空格 (LTrim)、后续空格 (RTrim) 或前导与后续空格 (Trim) 的字符串副本。

    LTrim(string)

    RTrim(string)

    Trim(string)

    string 参数是任意有效的字符串表达式。如果 string 参数中包含 Null,则返回 Null。

    说明

            下面的示例利用 LTrim, RTrim, 和 Trim 函数分别用来除去字符串开始的空格、尾部空格、 开始和尾部空格:

    Dim MyVar

    MyVar = LTrim("   vbscrīpt ")   'MyVar 包含 "vbscrīpt "。

    MyVar = RTrim("   vbscrīpt ")   'MyVar 包含 "   vbscrīpt"。

    MyVar = Trim("   vbscrīpt ")   'MyVar 包含 "vbscrīpt"。

     

    Rnd 函数
    返回一个随机数。

    Rnd[(number)]

    number 参数可以是任意有效的数值表达式。

    说明

            Rnd 函数返回一个小于 1 但大于或等于 0 的值。number 的值决定了 Rnd 生成随机数的方式:

    如果 number 为
     Rnd 生成
     
    小于零
            每次都相同的值,使用 number 作为种子。
     
    大于零
            序列中的下一个随机数。
     
    等于零
            最近生成的数。
     
    省略
            序列中的下一个随机数。
     

            因每一次连续调用 Rnd 函数时都用序列中的前一个数作为下一个数的种子,所以对于任何最初给定的种子都会生成相同的数列。

            在调用 Rnd 之前,先使用无参数的 Randomize 语句初始化随机数生成器,该生成器具有基于系统计时器的种子。

            要产生指定范围的随机整数,请使用以下公式:

    Int((upperbound - lowerbound + 1) * Rnd + lowerbound)

            这里, upperbound 是此范围的上界,而 lowerbound 是此范围内的下界。

    注意   要重复随机数的序列,请在使用数值参数调用 Randomize 之前,立即用负值参数调用 Rnd。使用同样 number 值的 Randomize 不能重复先前的随机数序列。

     

    Randomize 语句
    初始化随机数生成器。

    语法

    Randomize [number]

            可选的 number 参数是 Variant 或任何有效的数值表达式。

    说明

            Randomize 用 number 将 Rnd 函数的随机数生成器初始化,该随机数生成器给 number 一个新的种子值。如果省略 number,则用系统计时器返回的值作为新的种子值。

            如果没有使用 Randomize,则(无参数的)Rnd 函数使用第一次调用 Rnd 函数的种子值。

    注意 若想得到重复的随机数序列,在使用具有数值参数的 Randomize 之前直接调用具有负参数值的 Rnd。使用具有同样 number 值的 Randomize 是不会得到重复的随机数序列的。

  • [转载]TestComplete的数据驱动测试方法

    2007-09-15 20:28:32

    个人启发:把需要输入的参数数据从脚本分离开是一个很好的方法,一方面可以使得程序维护起来简单,也可以使得自动化案例执行起来也很方便,因为参数的输入可以从外部输入,自动化脚本自动读取就可以了。把输出结果输到外部去也是一个很好的方法

     

    原文:http://www.51testing.com/?action_viewnews_itemid_20233.html

       自动化测试把记录的或编写的用户操作序列的脚本回放,能覆盖被测软件的一部分特定的区域。为了获取大面积的覆盖,你可以用不同的数据来输入。如果你测试一个窗体的输入,录制完脚本后,你只是获得了录制时输入的数据的脚本。而且通常你录制时指定的数据不会引起程序的错误,但是其他数据可能会。Data-Driven Testing,数据驱动测试让你用不同的数据输入来测试软件,确保软件在各种输入情况下都工作正常。
     
    数据驱动方法
            最好的解决方案是把数据从脚本分离开来。数据驱动测试指的是脚本从外部存储点读入数据,例如,从一个文件或数据库,而不是使用硬编码的数据值。这样的分离会使测试逻辑更加简单。硬编码数据值会使脚本维护和修改更加困难。例如,如果你想要更多的输入数据,你就必须修改脚本代码。
     
    数据驱动方法的步骤
            通常,外部存储的数据会包括输入数据和验证数据。数据驱动方法的测试步骤包括下面操作的循环执行:
    1、 从存储点读入数据
    2、 在软件窗体上输入数据
    3、 检验结果
    4、 用下一项数据继续执行
     
    第一步:读入数据
            TC提供很多内建的方法来支持数据驱动,从文本文件、Excel表、数据库等地方读入数据。
     
            GetCSVCount和GetCSVItem用于处理CSV文件存储的数据。TC还提供DDT对象用于数据访问驱动,从Excel表格、数据库和CSV文件获取数据。DDT包括ADODriver、CSVDriver、ExcelDriver。
     
            下面脚本建立一个ExcelDriver从MyFile.xls中读入Sheet1表格,然后用EOF和Next方法遍历整张表格,最后用CloseDriver方法关闭Excel驱动。
    procedure TestDriver;
    var
      Driver : OleVariant;
    begin
      // Creates the driver
      Driver := DDT.ExcelDriver('C:\MyFile.xls', 'Sheet1');
     
      // Iterates through records
      RecNo := 0;
      while not Driver.EOF do
      begin
        ProcessData; // Processes data
        Driver.Next; // Goes to the next record
      end;
     
      // Closing the driver
      DDT.CloseDriver(Driver.Name);
    end;
     
     
    第二步:利用数据
            获取数据后,就可以在界面上输入这些数据,可以通过模拟键盘输入,或者给控件的属性赋值,从而模拟用户的数据输入。例如,下面脚本给窗体的Caption属性赋值:
    w := p.Window('MainForm', '', 1);
    SetValue(w, 'Caption', 'New Caption');
     
    第三步:检查结果
            最简单的检查结果是否正确的方式是把要检查的值也和输入数据存储在一起,然后读入检查的值,与真正的输出值进行比较。
     
            如果输出的是文件或图像,可以使用TC提供的文件和图像比较方法来进行比较。参考《TestComplete的Stores对象》。

  • [转载]一个UI自动化的小例子

    2007-09-15 19:46:13

    个人启发:自动化测试不仅仅录制脚本或者简单地编写一些脚本,其实自动化脚本也是程序,跟一个系统的程序一样,同样要讲求健壮性、可易读性、可理解性、可扩展性、可维护性等...

     

    原文:http://www.51testing.com/?action_viewnews_itemid_20231.html

    随便用一个小例子来解释一下UI自动化的开发吧.

      我先现在有一个Button是disable的状态,一旦Button enable,我们就Click弹出一个窗口.

      我们使用的测试工具就有同步的功能.

    1.自动化工具生成的程序(发现和操作控件,不能真正运行)

    button=FindButton(); 

    ClickButton(button);

    2.傻瓜的自动化程序(通过加入sleep变成可以运行的程序)

    button=FindButton(); 

    Sleep(10);

    ClickButton(button);

    Sleep(10);

    window=FindWindow();

    3.简单的自动化程序(加入同步,使得更可靠和有效率)

    button=FindButton(); 

    WaitButtonEnable(button);

    ClickButton(button);

    window=WaitWindowOpen();

    4.完整的自动化程序(保证100%可靠,没有测试程序bug,简单写了一下,没有包含exception的控制,时间急,可能也会有错误,不过就是这个意思)

    Button button=null;
    for(int i=0;button==null&&i<3;i++) //如果FindButton不稳定,调用三次in case
    {
        button=FindButton();
        if(button==null)
        {
            Log.Error("Tryout{0}:Can not find button",i); //测试工具不稳定
        }
        else
        {
            break;
        }
    }

    if(button==null)
    {
        Log.Error("Cannot find button. Quit"); //测试工具找不到button,或者产品问题
        Log.Screen();//截图,只是为了示例,以后不再单独写
        return;
    }

    if(!WaitButtonEnable(button))
    {
        if(button.Enabled==true) //测试工具问题,没有得到enable的消息
        {
            Log.Error("enabled, but tool didn't detect");
        }
        else//测试工具问题,不能成功检测button的状态,或者产品问题没有enable
        {
            Log.Error("don't enable");                      return;                                                                                                                                                                                                                                                                                                                
        }
    }

    Window window=null;

    for(i=0;window==null&i<3;i++)//ClickButton不稳定,或者没有得到open event,或者产品问题
    {
        ClickButton(button);
        window=WaitWindowOpen();
        if(window==null)//没有click或者没有得到消息,或者产品问题
        {
            int count=0;
    findwindow://FindWindow不稳定,重试3次
            window=FindWindow();
            if(window!=null) //没有得到消息,但是窗口弹出
            {
                Log.Error("didn't get event");
                break;
            }
            else //没有click,或者产品问题, 或者FindWindow不稳定
            {
                Log.Error("Tryout{0}:didn't get window",i);
                count++;
                if(count>3)
                {
                }
                else //FindWindow不稳定,workaround
                {
                    Log.Error("goto{0}",count);
                    goto findwindow;
                }
            }
        }
        else //成功
        {
            break;
        }
    }

    if(window==null)
    {
        Log.Error("didn't get window, maybe tool or product problem.");
        return;
    }

  • 终于有机会接触自动化测试了

    2007-09-15 19:38:20

       一直都想学自动化测试,但一直都没有动力去学

       现在终于有机会了

       部门启动了一个将持续一年的自动化测试项目,我很有幸被安排去参加了

       不过了解到---很遗憾这个项目都需要靠我们自学,不会有培训安排

       不过还是很兴奋

       没事,有团队一起学习,总比一个人学习起来要强,而且现在有目标,有责任,动力也就很大了

      明天去书城看有啥书,买几本书才行,呵呵...

      

     

      

Open Toolbar