Automate Everything

关于自动化相关的任何东西,包括自动化测试,Visual Studio宏, 自动化安装部署等
07
Apr
2008

转载:关于开发和测试

转载自:http://peking2toronto.spaces.live.com/Blog/cns!A975CAF18FBB985B!384.entry

最近总是有一些网友问我一个问题“现在有机会转开发,应不应该转?”。我想我也需要单独发表一篇文章来表达一下自己的看法了。我会从一个新入行的测试人员一直往上发展大概会是一个怎样的情况入手,来表达我的观点“开发技术是测试人员发展的基础,也是测试人员发展的归宿”。当然了,我现在表达的是测试人员一直往上发展,如果你已经对自己的发展感到很满意了,则不在这里的讨论范畴。(相信会有不少这样的人来提出自己的疑义)

从你刚入行开始,你面前基本上是有两条路可以发展。一是技术,二是管理。先说管理,很多人做了很短的时间就走向了管理,team lead,甚至manager。他们的工作已经很少用到技术了,更多的是学习和运用管理的知识。这样的人不在少数,我当时做测试3个月一转正就是team lead了,老板也非常希望我专注在管理方面。可是下一步怎么办?一般出现这种情况的都是在中小公司,而不是大而正规的外企.下一步你的发展会由于技术不够扎实而出现了瓶颈.第一,你不可能回头去搞技术了,因为你管理的地位,工资都高于技术人员,而且还有年龄的问题,这些因素造成了你只能继续管理。第二,如果你想跳槽到大的外企搞管理,可能性几乎为零,因为你没有大外企的经验又没有出众的技术。第三,如果你想在本公司或类似公司往上爬,比如做director,很可惜,这些公司往往不配备test director的职位,并且其他director的职位也很难由一个做测试的人来承担。(可能会有特例,但是应该很少)。因此,刚入行不久,没有扎实的技术沉淀,就走向了管理,很快就会发展到头了。

再说技术,我们知道测试的最高title就是SDET和SET了。实际上都是一个东西,微软叫SDET,Google叫SET。说白了,这种职位本质上就是开发,只不过不是产品的开发,而是测试的开发。需要很强的开发背景。因此,一个普通测试人员想要得到这种工作机会,开发的经验是必不可少的。另外,微软,Google这种最top的公司,基本上已经没有STE, SQAE这种职位了。而我们大多数人做的测试工作恰好正是这种职位。顶尖大公司的这种职位都外包了。因此,你想通过普通的STE, SQAE这种职位进入顶尖公司,可能性基本为零。因此,如果从技术上来讲发展,无论从title上还是公司上往往上走,开发的功夫都是必须的。

因为我说的是一直往上发展,因此到了SDET后怎么发展?基本上三条路,第一管理,第二开发,第三继续测试。先说管理,你从技术上一路走过来再走向管理跟前面讲到的那种管理是天壤之别了。首先,你已经是在顶尖公司了,其次,你已经具备了高深的技术水准了。放眼望去,整个测试行业还能有几个适合你的位子呢?还能有多少人能跟你相提并论呢?这条路可以lead->manager->director->vp->senior vp往上发展。那么发展到了最后还怎么发展呢?这个时候,我估计应该年纪很大了吧?钱很多了吧?享受生活吧。

再说转开发,因为SDET具备了比较强的开发水平(比一般公司的开发人员的水平要高),因此可以比较容易的转向开发。转向开发之后就属于开发的发展之路了,就不多说了。

最后说继续测试,一直以来都有个疑惑,为什么我从来没见过senior SDET?本来SDET可以向senior, principle这条路走下去。我以前也想过自己发展成test architect。可是,为什么没见过?依我现在的感觉来说,测试的技术很快就学到头了,开发的技术由于一直是在做测试程序,而不是真正的产品,因此提高的程度也受到了很大的限制。因此,在技术上来讲,一直工作下去就会维持在一种不是很高技术水平的状态。这种状态达不到senior的要求。这也是为什么周围很多SDET不知道工作了多少年,还是SDET。目前来看,想发展的话,维持在SDET不算现实。必须走向管理,或者转向开发了。这也是为什么director在回答我的问题“我在测试方面应该怎么发展?”。回答竟然是“短期来看要学好C,长期来看还是C,转向开发”。根本就没有提到测试。

以上是我自己的分析与理解。

大概几个发展路径

1.QA->management

2.QA->SDET->management

3.QA->SDET->Dev

当然还有其他的可能,比如

4.Dev->QA……

5.QA->Dev……

6.QA->Dev->SDET……

7.Dev->SDET……

8.SDET……

我想大家可以分析一下自己以前的发展之路,看看以后应该如何发展?当然了,如果自己已经满意了就算了。我的发展之路是这样的

Dev->QA->Management->SDET->(Lead/Dev/Senior if possible)

总而言之,在整个的发展路径中,如果你缺少Dev,都会限制你更好的往上发展。还有就是发展的高低,一要看title,二要看公司。很多小公司的manager可能根本都进不了大公司。很多大公司的普通员工一旦跳槽到小公司很容易就能升职。比如一个朋友在国内做了6年的外包经理,面试大公司总是失败,因为技术不行。还有朋友在顶尖公司只是SDET,跳到盛大就是director.

这里我想破除很多测试人员的一个幻想,我强调的一点是“不懂开发的测试没有太大的前途”。

把这篇文章分享到: These icons link to social bookmarking sites where readers can share and discover new web pages.
  • del.icio.us
  • bodytext
  • Google
  • Facebook
  • Furl
请给这篇文章打分:
太差了有点差马马虎虎了很不错非常好 ( 您是第一个打分的人)
Loading ... Loading ...

07
Apr
2008

转载:再谈UI自动化测试

转载自:http://peking2toronto.spaces.live.com/Blog/cns!A975CAF18FBB985B!410.entry?wa=wsignin1.0

最近还是发现有一些文章,个人对于自动化测试报有很大的怀疑态度,本人也对相关的文章给与了驳斥。我个人和公司对自动化测试都是报有很积极的态度的。这里我想再次的写一篇文章来阐述到底UI自动化测试可以做什么,作为一个优秀的UI自动化测试工程师应该具备有什么方面的技能,以及本人对UI自动化的一些经验和体会。

首先还是要强调一点,API和command line程序都是非常适合用自动化来进行测试的。我想这个观点,即使那些反对自动化测试的人也不应该否认吧?至少我觉得他们应该有这个意识。因此,对于他们反对自动化就集中在了UI自动化方面,我这里也完全站在UI自动化测试的角度来写这篇文章,后边就不再强调了。

再次套用朋友的一句话,"自动化测试听起来很神秘,学起来很简单,用起来很麻烦"。我想有过自动化测试经验的人,可能大多都有这个体会吧?前边的过程我就不提了,以后主要探讨为什么用起来会麻烦和怎样简单化自动化测试。总而言之,想搞好自动化测试,还是需要测试人员比较高的技术水平,尤其是编程能力和解决问题,分析问题的能力。

首先,我要谈谈自动化测试工具和编程语言的关系。作为一个优秀的自动化测试人员,他的最基本的能力就是编程水平了。所谓编程就是至少要精通一门高级语言,比如Java,C#等等,脚本语言不计算在内。请记住,不是熟悉,是精通。高级编程语言给我们提供很强的能力来实现一些东西。你所精通的语言能力越强,你在自动化测试可以做的事情就越多,越好。简单来讲,论程序的能力来排序是这样的,测试工具-〉脚本语言-〉高级语言(Java,C#)-〉C/C++-〉C++/CLI。根据这个语言能力的排序,结合你自己的语言能力,你可以想想你到底具备多少自动化测试能力。我所强调的是,如果你想优秀,你至少要精通一门高级语言,这是必不可少的。如果很多人还只是用测试工具,脚本语言工作而抱怨自动化,我要强烈的建议他们好好去学习一下编程能力先了。他们的问题在于,由于编程能力的不足,使得自动化测试的很多问题没有能力和办法去解决。再谈一下自动化测试工具,无论哪种测试工具,无论他们设计的多么强大,从编程语言来讲,他们最多能够达到脚本语言的能力。也就是说,如果你完全用测试工具来进行自动化的开发,很多问题你还是无法解决的。因此,我推荐的自动化开发方法是高级语言结合测试工具。我的自动化测试逻辑是,用测试工具只是完成UI操作,其他部分完全用高级语言来实现。我们不能否认高级语言所具有的能力,他们创造出了世界上这么多丰富多彩,这么多优秀的软件,难道开发测试程序会有问题吗?因此,我们的焦点就落在了测试工具的UI操作部分。

第二,关于测试工具。开发语言重要,选择一个合适的测试工具也同样的重要。一个灵活,强大的测试工具可以使你的自动化开发起到事半功倍的作用。结合不同的项目,不同的语言,你可能会有不同的选择。不过,这里我想解释的是,具有了高级语言的开发能力之后,我们期望测试工具来为我们做什么。我前边也说过了,我们所要求自动化测试工具所做的就是UI的操作。这里边比较重要的是三个方面,一是找到UI对象,二是操作UI对象,三是同步。如果一个工具能够让你找到所有的UI对象,并且能成功操作这些对象,就完全满足我们的自动化开发需要了。如果,工具能够提供同步的功能,就使你能够如虎添翼,不然的话要自己去实现,会麻烦不少。到了这里,你已经具有了所有UI的操作能力(测试工具提供),并且具有了高级语言的实现能力(高级语言提供),你才有了基本的能力去做一个优秀的自动化开发。没有这些能力的人,我严重怀疑能否做出好的自动化测试。

第三,怎样自动化。我的自动化的原则是,尽量少的进行UI的操作,除非是你本身要测试的UI。道理很简单,UI操作由于可能受各种问题的干扰,很容易失败。通过非UI的方法去实现是更加可靠和快速的。这也是我为什么要强调对于高级语言的精通,具有高级语言的开发能力,你就能过把大量的任务从UI操作转向了程序操作,使得你的自动化程序的可靠性大大的增强。这里还需要强调的一点能力就是系统应用的能力,比如Windows使用的能力。Windows的很多的操作是有相关的命令来实现的,不一定非得通过大家熟悉的UI。记住这个原则:除非是你要测试的UI,否则尽可能的通过高级语言来实现。我想大家对于高级语言来实现的工作应该还是有信心吧?因此,下边我要谈的内容就完全的与你要测试的界面相关了。

第四,怎样进行UI测试。首先要尽量的减少UI操作,除非是你必须要测试的操作。比如简洁快速的启动你要测试的界面,用快捷键代替鼠标操作等等。总而言之,理想状态下我们进行的每一次UI操作,都是我们需要测试的,其他操作尽量避免,不能避免用最可靠的方式去实现。那么我们现在的焦点就变成了,怎样来处理我们真正要测试的UI了。UI测试的开发基本上就三个问题:发现对象,操作对象和同步。简单解释一下同步,同步就是有一个机制告诉你何时可以执行一个UI操作。很多人是用sleep的方式,等待一定的时间去执行下一个操作,这是我非常反对的。我的原则是,尽量少用sleep,就算要用每次最多不要超过一秒。滥用sleep会严重影响测试程序的性能(具体的UI自动化过程,大家可以参考我的其他文章)。

第五,UI测试错误/异常的解决和Debug。通过以上的解释,我们只是在自己需要测试的UI操作才进行UI操作,否则通过高级语言或者系统命令来实现。是不是我们的UI自动化就完美了呢?绝对不是,这只是一个基础,还远远没有达到完美。我们在自动化开发和应用的过程中,大部分的时间其实是花费在了异常/错误处理和Debug上面。这跟真正的程序开发非常的类似,你如果去看代码的话,大量的是在进行返回值得检验和异常的处理。如果我们的程序在运行过程中出了问题怎么办,或者如果没有出现我们期望的结果怎么办?一般来说有三种问题,第一是产品的问题,我们可以报bug了,第二是你测试程序的bug,你需要fix。第三是其他的问题,比如测试工具,甚至高级语言本身的问题,你需要workaround。总而言之,优秀的测试程序最终的目的是,一旦程序的运行发现了问题,就是产品的问题,就是可以报bug的。能够达到这种境界才能算自动化测试的完美,才能算是一个真正优秀的测试人员。(当然了,正如软件产品不可能没有bug,你的测试程序也不可能完全没有bug。但是,由于软件产品是有大量的用户来使用,而你的测试程序只是很小范围内来使用,使得你消除影响测试过程的bug成为完全可能)

综上所述,一个优秀的自动化测试工程师必须要具备高级语言的开发能力,自动化工具的灵活应用能力,系统命令和使用的熟练能力等这些基本功,还更要具备优秀的Debug,Fixbug的能力,和保持程序稳定性能力。换句话讲,一个优秀的自动化测试工程师必定也是一个优秀的软件开发工程师。

最后谈一下我为什么要转向C++/CLI?从上边的排序大家可以看到,C++/CLI是目前Windows平台最强大的编程语言。在我的自动化开发的过程中,我需要高级语言和系统命令都不能完成的功能。如果没有C++/CLI我就必须要通过UI来实现,从而降低我程序的可靠性。而有了C++/CLI的功能,我就可以绕过UI操作了。总之,能够绕过UI操作的能力也体现出一个自动化测试人员的能力。从这个角度讲,测试人员有很多东西要学的。最后说一下,我自动化工作的要求是100%可靠,我还不能完全满足,因为使用我程序的人是那些手工测试的人,他们的使用环境的变化有可能引起一些问题的产生,基本上还不是我程序的问题,而是测试工具,或者其他模块的问题,我需要想办法去workaround。不过,随着一定时间问题的积累和解决,如果环境不变,应该可以达到100%可靠。(可是环境的变化是不会停止的,因此实际上很难达到永久的可靠,不过一段时间的可靠还是应该可以达到的,或者说我们的测试开发必须有这样一个目标,就如同软件开发的目标一样)

把这篇文章分享到: These icons link to social bookmarking sites where readers can share and discover new web pages.
  • del.icio.us
  • bodytext
  • Google
  • Facebook
  • Furl
请给这篇文章打分:
太差了有点差马马虎虎了很不错非常好 ( 您是第一个打分的人)
Loading ... Loading ...

07
Apr
2008

转载:一个UI自动化的小例子

转载自:http://peking2toronto.spaces.live.com/Blog/cns!A975CAF18FBB985B!411.entry?wa=wsignin1.0

随便用一个小例子来解释一下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;
}

把这篇文章分享到: These icons link to social bookmarking sites where readers can share and discover new web pages.
  • del.icio.us
  • bodytext
  • Google
  • Facebook
  • Furl
请给这篇文章打分:
太差了有点差马马虎虎了很不错非常好 ( 您是第一个打分的人)
Loading ... Loading ...

06
Apr
2008

你是否知道-Visual Studio中可以进行增量查询

翻译自:Did you know… The power of incremental searching

增量查询是一个很强大的查询工具,用于在当前文档中查询字符

使用步骤:
1. 按下快捷键Ctrl+I (或者菜单项:Edit.IncrementalSearch)
2. 输入需要查询的字符(注:这时,你可以看到光标跳转到第一个匹配的字符,并高亮显示当前搜索的字符)
3. 如果你想移动到下一个匹配的字符,再次按下Ctrl+I
4. 如果你想移动到前一个匹配的字符,按下Ctrl+Shift+I 
 

5. 按ESC退出增量查询

 

把这篇文章分享到: These icons link to social bookmarking sites where readers can share and discover new web pages.
  • del.icio.us
  • bodytext
  • Google
  • Facebook
  • Furl
请给这篇文章打分:
太差了有点差马马虎虎了很不错非常好 ( 您是第一个打分的人)
Loading ... Loading ...

06
Apr
2008

你是否知道-Visual Studio中进行列选取

我现在已经不用类似UltroEdit这样的文本编辑器了,Visual Studio本身已经自带了很强大的文本编辑功能.
我们先来看一下在VS中怎么进行列选取:
翻译自:Did you know… How to do column selection

你是否知道,Visual Studio有两种选取模式?文本流和文本块选取
文本流的选取大家都比较熟悉,按下Shift键,然后上下左右移动光标进行选取。
文本块选取允许你同时进行行和列的选取:
将光标定位到块的起点,然后同时按下Shift和Alt键,移动光标,你就可以看到选取效果了:)

把这篇文章分享到: These icons link to social bookmarking sites where readers can share and discover new web pages.
  • del.icio.us
  • bodytext
  • Google
  • Facebook
  • Furl
请给这篇文章打分:
太差了有点差马马虎虎了很不错非常好 ( 您是第一个打分的人)
Loading ... Loading ...

06
Apr
2008

你是否知道- 关于Visual Studio的N件事

声明:此一系列文章翻译自:Sara Ford’s WebLog

因为工作关系,经常会用到Visual Studio,而且也做过VC#部分的自动化测试(当时是作为Vendor在Microsoft工作了一年多),偶然间看到Sara Ford的blog,上边关于Visual Studio的一些Tips,非常使用,感觉有必要翻译出来给更多人知道:)

后边我会加上我在用Visual Studio的时候的一些Tips,如果有时间的话,我还打算写一个关于Visual Studio中Intellisense和宏的专题。

到现在开始,我已经计划了三个专题了:

1. Visual Studio的智能感知

2. Visual Studio中的宏

3. UIAutomation自动化测试框架

把这篇文章分享到: These icons link to social bookmarking sites where readers can share and discover new web pages.
  • del.icio.us
  • bodytext
  • Google
  • Facebook
  • Furl
请给这篇文章打分:
太差了有点差马马虎虎了很不错非常好 ( 您是第一个打分的人)
Loading ... Loading ...