我是个不幸的人, 更不幸的是你浏览了我的空间 ! 从此你将沾上我的霉运, 只有再次的、频繁的来此地洒水浇花 !!!!!!!!!!!!!!!!!!!!! 才能................................................................................................................. 志同道合的朋友们, 大家一起来玩转QTP吧!

发布新日志

  • Configure the network of CentOS

    2014-06-18 09:07:35

    系统完整完成后需要做如下配置:

    1:修改网卡eth0的配置信息

    vi /etc/sysconfig/network-scripts/ifcfg-eth0 
    修改 NBOOT="no" 
    ONBOOT="yes"

    2: 启动visual box的dbcp服务,给eth0分配ip地址

    dhclient eth0

    3: 重新启动网络,让刚才的配置生效

    service network restart

    4:测试 
    ping www.baidu.com

  • How to install testlink?

    2014-01-13 16:48:15

    a) 运行XAMPP 启动Apache、MySQL服务 

    b) 将testlink的压缩文件,解压到xampp的htdocs文件下,重命名为testlink,访问
    http://localhost/testlink/index.php 即可出现testlink的安装界面

    c)Read/write permissions error
    Fix solutions:
    修改config.inc.php文件:testlinkDir表示安装目录路径,本次安装为 /opt/lampp/htdocs/testlink
    //$tlCfg->log_path= '/var/testlink/logs/'; /* unix example 注释掉该句,添加如下内容*/
    $tlCfg->log_path = '../logs/';
    或者
    $tlCfg->log_path = ' /opt/lampp/htdocs/testlink/logs';

    //$g_repositoryPath= '/var/testlink/upload_area/';  /* unix example注释掉该句,添加如下内容*/

    $g_repositoryPath = '../upload_area/';

    或者
    $g_repositoryPath = ' /opt/lampp/htdocs/testlink/upload_area';

    d)DB information

    输入以下信息:  

    Database Type:Mysql 

    Database host:localhost 

    //********  

    Database name:testlink 

    //********  

    Database admin login:root 

    Database admin password:空 

    //********  

    TestLink DB login:testlink_db 

    TestLink DB password:testlink_db

    e)Email configuraiton:

    YOUR ATTENTION PLEASE:
    To have a fully functional installation You need to configure mail server settings, following this steps

    • copy from config.inc.php, [SMTP] Section into custom_config.inc.php.
    • complete correct data regarding email addresses and mail server.

  • Java Coding Style Guidelines

    2013-11-12 12:22:35

    Reference URL: http://www.iwombat.com/standards/JavaStyleGuide.html


    iWombat.com

    Java Coding Style. Guidelines

    © 2000 iwombat.com


    Table of Contents


    Naming Conventions

    Package Names 
    Class and Interface Names 
    Method Names 
    Attribute and Local Variable Names 
    Arrays vs Lists 
    Don't "Hide" Names


    Usage Conventions

    Class Attributes 
    Modifier Usage 
    Class and Package Imports 
    Methods 
    Keep it Simple 
    Place Constants on Left Side of Expressions 
    Optimization vs Abstraction


    javadoc

    Overall Guidelines 
    Method Documentation 
    Use the @deprecated Tag


    Naming Conventions

    Package Names

    Following a developing, de-facto standard in the Java world, all packages should be prefixed with: "com.iwombat"

    Further subdivision is up to the individual project teams. In the case of common code, reusable components will be placed within a package named according to the component, such as "com.iwombat.security" or "com.iwombat.ui". Business objects will be segregated by business domains, or product offerings, as appropriate.

    Package names should always be expressed in lowercase. In the event that multiple words are used to define a level in the package naming hierarchy, these words should be run together with no separating space or other character. Abbreviations can be used if they are commonly used, i.e. ui for user interface. An incorrect package name would be "com.iwombat.user_interface" due to the separating character between "user" and "interface".

    Acceptable:com.iwombat.uiUnacceptable:com.iwombat.user_interface

    Class and Interface Names

    Class names are always nouns, not verbs. Avoid making a noun out of a verb, example DividerClass. If you are having difficulty naming a class then perhaps it is a bad class.

    Interface names should always be an adjective (wherever possible) describing the enforced behaviors of the class (noun). Preferably, said adjective should end in "able" following an emerging preference in Java. i.e. Clonable, Versionable, Taggable, etc.

    Class, and interface names begin with an uppercase letter, and shoule not be pluralized unless it is a collection class (see below).

    Acceptable:class FoodItem 
    interface Digestable
    Unacceptable:class fooditem 
    class Crackers 
    interface Eat


    Naming collection classes (in the generic sense of collection) can be tricky with respect to pluralization. In general each collection should be identified as a plural item, but not redundantly so. If you are a collection type as part of the class name (List, Map, etc.) it is not necessary to use the plural form. in the class name. If you are not using the collection type in the name it is necessary to pluralize the name. If you are extending one of the java colletction class (Map, HashMap, List, ArrayList, Collection, etc.) it is good practice to use the name of the collection type in the class name.

    Acceptable:class FoodItems extends Object
    class FoodItemList extends ArrayList
    class FoodItemMap extends HashMap 
    Unacceptable:class FoodItem extends ArrayList
    class FoodItemsList extends ArrayList


    Class names should be descriptive in nature without implying implementation. The internal implementation of an object should be encapsulated and not visible outside the object. Since implementation can change, to imply implementation in the name forces the class name and all references to it to change or else the code can become misleading.

    Acceptable:AbstractManagedPanel
    LayeredPanel
    Unacceptable:PanelLayerArray
    When using multiple words in a class name, the words should be concatenated with no separating characters between them. The first letter of each word should be capitalized.Acceptable:InverntoryItemUnacceptable:Inverntory_item
    Inventoryitem
    Other than prefixes, no abbreviations should be used unless it is a well known abbreviation.Acceptable:CD=Compact Disc
    US=United States
    Unacceptable:Cust=Customer
    DLR=Dealer

    Method Names

    Method names are typically verbs. However they can also be nouns for example accessor methods (see accessor methods below). In general, when a method modifies the object (or a related object) somehow use a verb appropriate to the nature of the modification. i.e. set, free, sort etc. If the method is an accessor method use a noun appropriate to the information that is returned.

    Acceptable:label getTag()
    void setWidth(int)
    void resetCounter()
    Unacceptable:label tagIs()
    void counterNew()
    Names should reflect exactly what the method does (no more or no less). A method should only have a single purpose. If your method contains too much functionality, then you should break it into more than one method.

    Strive for names that promote self documenting code. The method name should read well in the code. Picture how the method will appear in your code.

    Method and function names begin with a lowercase letter. The initial letter of any subsequent words in the name are capitalized, and underscores are not used to separate words.

    Acceptable:setInitState()
    getAttributeCollection()
    Unacceptable:set_init_state()
    getattributecollection()
    Method names should be defined so as to describe the function of the method without implying implementation.Acceptable:addItem()
    getItem()
    Unacceptable:addItemToVector()
    getHashItem()

    Attribute and Local Variable Names

    Do not use abbreviations, use full names. Variable names begin with a lowercase letter. The initial letter of any subsequent words in the name are capitalized, and underscores are not used to separate words (or scope variables). Clarity of variable names can be increased by providing some indication of the type of class they might become. Attributes that are not collections should not be pluralized.

    Acceptable:Item menuItem;
    JPanel managerJPanel;
    Unacceptable:JPanel Managerpanel;
    JPanel Manager_panel;
    int _localInt;
    InventoryItem i;
    Collection classes, such as vectors and hashes should always be pluralized. Alternately, collection classes can also be prefixed with the word some.Acceptable:Vector menuItems;
    Vector menuItemsVector;
    Vector someMenuItems
    Unacceptable:Vector menuItemVector;
    Vector aBunchOfMenu


    Name variables with the most abstract class that they can hold. For example if startButton could be any control object, then it should be named a startControl .

    If the variable truly represents an anonymous object but is restricted by an interface, then including the interface name in the variable can increase clarity. i.e. clonableInventoryItem .

    Declare each variable separately on a single line. Do not comma separate variables of the same type.

    Acceptable:int counter;
    int lastCounter;
    Unacceptable:int counter, lastCounter;


    Constant values should have uppercase letters for each word and each word should be separated by an underscore. The capitalization of constants helps to distinguish them from other nonfinal variables.

    Acceptable:public final static int MAX_AGE = 100;
    public final static Color RED = new Color(count++);
    Unacceptable:public final static int MAXAGE = 100;
    public final static int maxAge = 100;
    public final static int MaxAge = 100;

    Returning Arrays and Lists

    Any method that will returns an list of homogeneous or heterogeneous items should return a Collection (or other collection class) object -- never an array.

    Example: for a method that returns a list of keys represented as strings.

    Acceptable:List getKeys();Unacceptable:String[] getKeys();


    Also, any method that returns a Collection should always return a valid Collection -- never null. However, the returned Collection can be empty.

    Acceptable:
    public ArrayList getKeys() {
       if (0 == this.numValidKeys) {
          return new ArrayList();
       }
       return myKeyList;
    }
    Unacceptable:public ArrayList getKeys() {
       if (0 == this.numValidKeys) {
          return null;
       }
       return myKeyList;
    }

    Don't "Hide" Names

    Name hiding refers to the practice of naming a local variable, argument, or field the same (or similar) as that of another of greater scope. For example, if you have a class attribute called firstName do not create a local variable called firstName or anything close to it, such as firstNames or fName. Try to avoid this, it makes you code difficult to understand and prone to bugs because other developers will misread your intentions and create difficult to detect errors.


    Usage Conventions

    Class Attributes

    Class attributes should always be accessed through accessors and mutators (getters and setters). Accessors and mutators are methods used to return and set the attribute value. These methods typically begin with "get" or "set", followed by the attribute name. As with other methods, the first letter of the method name should be in lowercase.
    Note: Boolean accessors typically begin with "is" i.e. isFixed(), and return a Boolean value.

    Example:

    Attribute(s):
       int useCounter;

    Getter:
       int getUseCounter(){
          return useCounter;
       }

    Setter(s):
       void setUseCounter(int count){
          useCounter = count;
       }

       void incrementUseCounter() {
          setUseCounter(getUseCounter()+1);
       }

       void decrementUseCounter() {
          setUseCounter(getUseCounter()-1);
       }

    Be safe and initialize all local variables at creation and all class attributes in the constructor(s)! 

    Modifier Usage

    Always use "public", "protected" and "private" keywords, and use them correctly. Attributes should rarely be public as this violates encapsulation. Declare attributes as "private" and access them through public or protected getters and setters. Use static methods to define constants instead of public static attributes (e.g. UILayerdPanel.getActiveLayers() ). Methods in the public interface of a class should be declared as public. Other methods should be declared as protected.

    Class and Package Imports

    To make for more readable code, types used in code should be imported rather that fully qualifying the class name. In general, import only those classes necessary. Importing java.util.* when only two or three classes are needed will increase the runtime footprint of the application.Acceptable:import java.util.Date;
    Date aDate = new Date();


    Unacceptable:

    java.util.Date aDate = new java.util.Date();
    Importing rather than fully qualifying references adds an advantage in architecting an application. For example, imagine a platform-specific implementation of some classes which do CD drive manipulation. Imagine that the behavior. resides in the class CDPlayer. If references are coded as

       com.iwombat.ui.winnt.CDPlayer aPlayer = new com.iwombat.ui.winnt.CDPlayer();

    then all those references would have to change when you port to UNIX. However, if the class is referenced as below:

       import com.iwombat.ui.winnt.CDPlayer;
       CDPlayer aPlayer = new CDPlayer()

    Then changing to UNIX simply requires importing com.iwombat.ui.unix.CDPlayer instead.

    Imports should be done on specific classes only. Imports should not include entire packages.

    Acceptable:import javax.servlet.http.HttpServletRequest;
    import javax.ejb.SessionBean;
    Unacceptable:import javax.servlet.http.*; 
    import javax.ejb.*;
    Importing specific classes rather than entire packages simplifies class resolution for both the compiler and the developer, since there is no ambiguity about the package of an imported class. Also, importing java.util.* when only two or three classes are needed will increase the runtime footprint of the application.

    Methods

    Methods in well-designed object-oriented code are short. Strive to keep methods less than 10 lines. Reconsider methods that are over a page in length, breaking them into several methods representing smaller blocks of functionality.

    Break up long methods into small methods. This promotes code reuse and allows for more combinations of methods. If the number of methods grows to be difficult to understand, then look at decomposing the class into more than one class.

    Follow the 30-second rule. Another programmer should be able to look at your method and fully understand what it does, why it does it and how it does it in less than 30-seconds. If that is not possible, then your code is too complex and difficult to maintain. A good rule of thumb is that a method should be no more than a screen in length.

    Keep it simple

    Avoid nesting blocks of statements more than 2 or 3 levels deep. This adds to the complexity of the code. A method should be easy to read and understand. Easy to maintain is the goal.

    Avoid nesting method calls too deeply, since this can introduce undue complexity.

    Avoid using compound predicates:

    if (x>0 && x<100 && y>0 && y<100 || z==1000)Think of all the combinations you will have to write to adequately test the above condition (2^5 or 32 different combinations).

    Place Constants on Left Side of Comparisons

    Consider the code examples below. They are both equivalent, at least on first inspection. However, example 1 compiles and example 2 does not. With a closer look you'll see that the second statement isn't doing a comparison its doing an assignment. Example 2 tries to make an assignment to the constant value 0, and thus fails to compile. Assignments vs. comparison mistakes can be difficult to find in your code. But, by placing the constant on the left side you can let the compiler do the work for you.
    1.    if (something == 1) { ... } 
         if (x = 0) { ... }

    2.    if (1 == something) { ... } 
         if (0 = x) { ... }

    Optimization vs Abstraction

    Code in a two pass mode. First, implement with good OO abstractions and a well though out design. Second, when integrating your class into the its framework or application, measure performance and seek out the bottlenecks. Then optimize the bottlenecks.


    Javadoc Conventions


    Included in sun's JDK is a documenting tool called javadoc that processes Java source code files and produces external documentation in the form. of html files. Javadoc is a great utility, but it does have limitations. Javadoc supports a limited number of tags -- learn them and use them well. The following is a general guideline for commenting your code to support javadoc.

    Overall Guidelines

    • Document What code does as well as why it was developed. For example, youcan look at a piece of code, or class and figure out what it does internally. However, it may not exactly be apparent what requirements, or other systems this class supports or, why the code is trapping for and throwing certain exceptions.
    • Document difficult or complex functionality
    • Document dependencies, if methods call other methods internally it is important to note that in the method description.
    • Document members of the Domain Object Model that your class is based on, or inspired by.
    • Methods that implement an interface should not provide javadoc comments, since the javadoc comments are included in the interface and will be referenced when javadoc executes.

    Standard .java file header

    Every .java source file should include the standard iwombat header template and detail out the items as appropriate.

    Method Documentation

    Each method should include the @exception@param, and @return javadoc tags where appropriate.

    Acceptable:/**
    * Method to check if proscribed operation is allowed for this object.
    * This method is needed to provided some level of security on operations.
    *
    * @param action must be an operation that has registered itself with the object
    * @return boolean true if the operation is allowed, false otherwise.
    * @exception UnknownOperation exception is thrown when an operation that has not
    * registered with the object is passed as a parameter.
    *
    */

    public boolean operationIsAllowed(Operation action)
    throws UnknownOperation
    {

    }

    Unacceptable:/**
    * operation check takes an operation and returns true or false
    */

    public boolean operationIsAllowed(Operation action)
    throws UnknownOperation
    {

    }

    Use the @deprecated Tag

    In general it is not a good idea to remove methods from a class (or classes from a package), instead label old methods with the@deprecated tag. With liberal use of this tag you are less likely to break builds and code in use elsewhere. However, the compiler will produce warnings letting other developers know that they are using a deprecated method (or class).

    Acceptable:

    /**
    * Method to check if proscribed operation is allowed for this object.
    * This method is needed to provided some level of security on operations.
    *
    * @param Operation must be an operation that has registered itself with the object
    * @return boolean true if the operation is allowed, false otherwise.
    * @exception UnknownOperation exception is thrown when an operation that has not
    * registered with the object is passed as a parameter.
    * @deprecated No longer used, SecurityAccessor class in com.iwombat.security replaces functionality
    * @see com.iwombat.security
    */

    public boolean operationIsAllowed(Operation action)
    throws UnknownOperation
    {

    }

    Unacceptable:/**
    * operation check takes an operation and returns true or false
    * no longer needed use SecurityAccessor
    */

    public boolean operationIsAllowed(Operation action)
    throws UnknownOperation
    {

    }

  • How to implement Mouse and Keyboard actions in GUI automation?

    2013-11-11 13:20:11

    Selenium - Java
    1. 
    (Maybe only work at local, not for remoter server)
    WebElement myElement = wd.findElement(By.id("usermenu_save"));
    Point coordinates = myElement.getLocation();
    Robot robot = new Robot();
    robot.mouseMove(coordinates.x + 20,coordinates.y + 20);
    Thread.sleep(500);
    robot.mousePress(InputEvent.BUTTON1_MASK);
    Thread.sleep(500);
    robot.mouseRelease(InputEvent.BUTTON1_MASK);
    Thread.sleep(3000);


    InputEvent.BUTTON1_MASK  ,the left mouse button
    InputEvent.BUTTON2_MASK  ,the middle mouse button
    InputEvent.BUTTON3_MASK  ,the right mouse button

    2.
            wd.switchTo().frame("NamoSE_Ifr__artContent_namo");
    //        wd.findElement(By.id("usermenu_save")).sendKeys(Keys.ENTER);
            Mouse mouse = (RemoteMouse) ((HasInputDevices) wd).getMouse();
            WebElement myElement = wd.findElement(By.id("usermenu_save"));
            Point coordinates = myElement.getLocation();
            mouse.mouseDown( (Coordinates) coordinates );
    //        mouse.mouseUp((Coordinates)coordinates);
  • How to configure network(ethernet&wirless) on CentOS?

    2013-11-09 23:46:20


    1. You can start by listing all ethernet devices detected by the kernel:

    lspci|grep -i eth
    If you can't find lspci, install the pciutils package (yum install pciutils). 

    2. Then, to see if you have any wireless devices that have already had their kernel drivers loaded:
    iwconfig

    If you can't find iwconfig, install the wireless-tools package (yum install wireless-tools). If iwconfig reports a device with wireless extensions, then you're half-way there. Report back and we'll help you associate w/an SSID, enter a Key, etc.

    If you don't, you'll need to get the proper driver loaded. Try this site for help:

    http://wiki.centos.org/HowTos/Laptops/Wireless



  • Selenium - Grid2

    2013-10-25 14:33:27

    What is grid?
    • scale by distributing tests on several machines ( parallel execution )
    • manage multiple environments from a central point, making it easy to run the tests against a vast combination of browsers / OS.
    • minimize the maintenance time for the grid by allowing you to implement custom hooks to leverage virtual infrastructure for instance.

    Quick Start

    This example will show you how to start the Selenium 2 Hub, and register both a WebDriver node and a Selenium 1 RC legacy node. We’ll also show you how to call the grid from Java. The hub and nodes are shown here running on the same machine, but of course you can copy the selenium-server-standalone to multiple machines.
    Note: The selenium-server-standalone package includes the Hub, WebDriver, and legacy RC needed to run the grid. Ant is not required anymore. You can download the selenium-server-standalone-*.jar from http://code.google.com/p/selenium/downloads/list. This walk-through assumes you already have Java installed.

    Step 1: Start the hub

    The Hub is the central point that will receive all the test request and distribute them the the right nodes.

    Open a command prompt and navigate to the directory where you copied the selenium-server-standalone file. Type the following command:

    java -jar selenium-server-standalone-2.14.0.jar -role hub

    The hub will automatically start-up using port 4444 by default. To change the default port, you can add the optional parameter -port when you run the command. You can view the status of the hub by opening a browser window and navigating to: http://localhost:4444/grid/console

    Step 2: Start the nodes

    Regardless on whether you want to run a grid with new WebDriver functionality, or a grid with Selenium 1 RC functionality, or both at the same time, you use the same selenium-server-standalone jar file to start the nodes.

    java -jar selenium-server-standalone-2.14.0.jar -role node  -hub http://localhost:4444/grid/register

    Note: The port defaults to 5555 if not specified whenever the "-role" option is provided and is not hub.

    For backwards compatibility "wd" and "rc" roles are still a valid subset of the "node" role. But those roles limit the types of remote connections to their corresponding API, while "node" allows both RC and WebDriver remote connections.

    Using grid to run tests

    ( using java as an example ) Now that the grid is in-place, we need to access the grid from our test cases. For the Selenium 1 RC nodes, you can continue to use the DefaultSelenium object and pass in the hub information:

    Selenium selenium = new DefaultSelenium(“localhost”, 4444, “*firefox”, “http://www.google.com”);

    For WebDriver nodes, you will need to use the RemoteWebDriver and the DesiredCapabilities object to define which browser, version and platform. you wish to use. Create the target browser capabilities you want to run the tests against:

    DesiredCapabilities capability = DesiredCapabilities.firefox();

    Pass that into the RemoteWebDriver object:

    WebDriver driver = new RemoteWebDriver(new URL("http://localhost:4444/wd/hub"), capability);

    The hub will then assign the test to a matching node.

    A node matches if all the requested capabilities are met. To request specific capabilities on the grid, specify them before passing it into the WebDriver object.

    capability.setBrowserName();
    capability.setPlatform();
    capability.setVersion()
    capability.setCapability(,);

    Example: A node registered with the setting:

     -browser  browserName=firefox,version=3.6,platform=LINUX
    will be a match for:
    capability.setBrowserName(“firefox” ); 
    capability.setPlatform(“LINUX”);  
    capability.setVersion(“3.6”);

    and would also be a match for

    capability.setBrowserName(“firefox” ); 
    capability.setVersion(“3.6”);

    The capabilities that are not specified will be ignored. If you specify capabilities that do not exist on your grid (for example, your test specifies Firefox version 4.0, but have no Firefox 4 instance) then there will be no match and the test will fail to run.








    Reference document: https://code.google.com/p/selenium/wiki/Grid2
  • Verification and Validation

    2011-02-27 12:21:01

    以下是本人在网上搜罗的一些关于Verification 和 Validation 两者之间比较的区别, 仅供参考 
     
    改行做tester已经一个月左右,我的mentor远在万里之外的美国,记得第一次指导,他通过远洋电话说tester除了要测试对与错之外,还要侧重是否是有效的。换言之,就是本文说得是Verification和Validation。Verification也就是说要做正确、而Validation是看经过Verification是否是我们想要的。       Verificaiton是我们可以预见的,在测试以前就知道我们期望一个什么结果。例如我要找GF,首先对方要是个女的,if(Person.gender!=female) return false;做IC的,读卡器芯片,必须能够读相应的数码卡;做sales的,评价Performance的标准每个月的销售额就是Verification的标准,Verification是否可以说是理性思维大于感性。1是1,2是2。而Validation首先前提是经过Verification,重要的是做的是否是customer需要的。拿刚才三个例子,我相信任何一个人找对象,不会只需要一个异性。验证Validation,还要看是否是自己喜欢的; IC做出来了,是否市场真的需要。做sales,除了销售额,是否让客户买对了产品,是否增加了客户的忠诚度,是否合乎客户使用习惯应该是Validation过程。 可以说Validation更多的是感性因素多,也是一个及其难以掌握的事情。毕竟,think from others是一件非常难的事情。      看看windows xp,尽管安全问题依旧,但是很多用户会毫不犹豫地抛弃win98。其实经过调查,大多数原因是界面比以前漂亮友好了很多。而且使用方面,和之前的版本对于绝大多数人来说能够最大程度保持一致。 Microsoft的可怕不在于技术,而在于它能够让我们养成了习惯,习惯是很难改变的,而掌握了客户的习惯和心态,这正是做Validation的极高境界。      不多说了,下周末又有一场婚礼要参加。看样又有一对新人经历了Verifiaction和Validation。
     
    Verification
    Although “verification” and “validation” at first seem quite similar in
    CMMI models, on closer inspection you can see that each addresses
    different issues. Verification confirms that work products properly reflect
    the requirements specified for them. In other words, verification ensures
    that “you built it right".
     
    Validation
    Validation confirms that the product, as provided, will fulfill its intended
    use. In other words, validation ensures that “you built the right thing.”
     
    Verification - 确证 -- 对已有结果加以核实, 关键在于 verify -- 再次证明
    Validation - 验证 -- 对结果的有效合理性加以验证, 关键在于validity -- 合理性
     
    Verification是验证,是通过提供客观证据证明规定的要求是否得到满足,也就是说,输入与输出比较.
    Validation是确认,是在验证好的基础上,对预期的使用和应用要求是否得到满足,也就是说,在确认时,应考虑使用和应用的条件范围要远远大于输入时确定的范围.一般是由客户或代表客户的人执行.
     
  • 学习感想之VBScript

    2008-03-17 10:48:41

    学习VBscrīpt因为它是Quick Test Professional的脚本语言。本人也没有太深的编程基础,虽然接触过CC++JavaC#等现今占据统治地位的语言,但相对来说还是比较了解C语言,对面向对象的编程思想认识也不深刻。VBscrīpt比较简单易学,而且提供了丰富的功能,作为脚本语言它已经足够强大了。所以觉得Mercury选择VBscrīpt作为QTP的脚本语言还是非常有道理的,觉得很适合自己。

    慢慢的把自己的兴趣培养起来, 希望能够养成一个良性的好的学习循环。毕竟靠着一腔热情去学习是不可靠的,习惯,我还是推崇习惯。我把平时自己的学习所得通过一个可查的方式记录下来,方便将来回顾自己所学的东西。同时也可以和我有一样想法的人做一些交流。

    有人说得好:交换一个苹果,它还是一个苹果;交换一种思想,它就会变成两种思想。

Open Toolbar