海是我向往的地方,吸纳和咆哮是他的魅力!!!

发布新日志

  • 详解IE浏览器的缓存

    chop123 发布于 2009-05-25 23:02:00

    我们在上网浏览信息时经常会用到IE里的“前进”、“后退”按钮,来调用阅读过的页面。你会发现,这时的显示速度比较快。其实这些刚调出来的内容就存放在电脑的缓存中,而不需再次从网上重新传输数据。这就引出了一个概念——缓存,你对它是否了解呢?让我们一起来了解一下这方面的知识吧!

      缓存的概念


      缓存是指在本地使用的电脑中开辟一个空间,作为数据传输的缓冲区。IE里的缓存主要就是用来暂时保存用户以前访问过的信息。既然缓存存在于硬盘之中,那么它肯定是以文件夹的形式出现的。各个不同类型的浏览器都有各个不同的文件夹作为缓存使用。在系统缺省状态下,IE 5.0的缓存文件夹为“WINDOWSTemporary Internet Files”。

      缓存的工作原理

      当用户在浏览器中设置一定量的磁盘缓存后,浏览器上网工作时会把从网上读出的网页、图像以及其他数据存放在磁盘缓存之中,并建立相应的文档索引。然后检查磁盘缓冲区中是否存在相应的数据。如果有,则直接从本地磁盘上读出。缓存按照信息存放的位置可分成内存缓存和硬盘缓存两种。内存缓存是用于暂时存储本次上网所调用的数据资料的,从Internet上传来的每一个网页信息,在内存缓存中都相应地给予保存一个备份,“前进”和“后退”实际上是将以前的页面从内存缓存中调出来并显示在用户的浏览器窗口中,在内存缓存中存放的网页信息量和内存缓存的大小有关,内存缓存越大,保存的网页信息量就越多。硬盘缓存是用于保存用户前几次上网时所调用的信息资料,用户从“历史记录”中调出的内容其实就是保存在硬盘缓存中,只要用户开辟的硬盘缓存足够大,就可保存用户前几个星期甚至几个月前调用过的信息资料。

      缓存的正确设置

      如果缓存容量设置的太小,所能存放的数据信息量就很小,大部分数据还是需要从网上重新下载,并且系统还要花费一定的系统资源来频繁清除缓存中的数据,最终结果会使浏览速度明显下降。

      如果浏览器的缓存设置太大,磁盘缓存中存放的数据信息量将很大,以后每次需要重新访问这些信息时,浏览器将不得不在庞大的缓存信息中搜索需要的文档,这样会使硬盘频繁工作,所需时间将长于从网上下载数据的时间。另外,如果缓存容量设置得太大,在硬盘容量一定的情况下,其他系统程序占用的资源将变得相对较少,从而会降低电脑本身的运行速度,磁盘缓存就失去了应有的作用。如果你经常要访问的信息量很大,而且电脑中的硬盘有较多闲置空间,那么你可以把硬盘缓存的数值设置成100MB~300MB。

      用户无论使用哪一种浏览器,正确设置浏览器的缓存参数将大大地提高浏览效率,并在一定程度上改善浏览器的工作性能。我们以IE 5.0浏览器为例:

      打开IE 5.0操作窗口,单击“工具”菜单中的“Internet选项”,屏幕上将出现“Internet选项”对话框。单击“常规”标签下的“Internet临时文件”设置栏,单击“设置”按钮,程序将会打开一个标题为“设置”对话框。如果用户想节省硬盘的空间,也可选取“删除文件”按钮,以便释放出更多缓存空间。

      在“设置”对话框上有4个单选项:

      1、每次访问此页时检查:表示浏览器将发送一个信息给所要访问的页面的Web服务器,查询当前访问的信息是否有变动,如无变动,就从硬盘缓存中直接调用,而且每次访问都要发送信息给Web服务器进行验证。

      2、每次启动Internet Explorer时检查:表示本次上网浏览器将只发送一次信息给Web服务器进行验证,以后无论信息是否发生变动,都从硬盘缓存中直接调用所要访问的页面的信息。

      3、自动:表示浏览器将自动检查所要访问的信息最近是否发生变动,如有变动,则从Internet上重新下载网页;相反,则直接从硬盘中读取数据。

      4、不检查:表示对要调用的页面信息不进行校验,直接从硬盘中调用。

      弄清楚了以上4个选项后,用户就可根据自己的实际情况进行设定,浏览器默认选择“自动”这一单选项。

      在“使用的磁盘空间处”用鼠标直接拖动滑动杆来改变缓存的大小,或者直接在后面的文本框中输入具体的数值。如果用户想改变浏览器缓存的位置,如C盘空间小或为使用方便,用户只需将缓存移到其他分区或者把缓存放到一个易操作的地方,就可通过另外选择一个文件夹来作为缓存。在这里用户只要按下“移动文件夹”并指定要新建的文件夹名称即可。参数设定后,单击“确定”按钮,退出选项对话框。

      注意事项

      1、磁盘缓存如果使用不当或使用时间较长时,有时会导致浏览器降低工作效率或停止工作。具体表现在:一是打开一个网页时硬盘不停地工作,需很长的时间才有反应。这是因为缓存太大、缓存中数据太多造成的;二是浏览器不工作,无法打开任何网页。这是因为缓存中的数据文档混乱或者已经破坏造成的。解决此类问题的方法是适当减小缓存容量或者定期及时清理缓存中的数据。

      2、使用缓存后网页不能自动更新,虽然在设置缓存时可自动检测网页是否更新,但实际工作中常出现读出旧网页内容。解决上述故障的方法是随时按下浏览器的“刷新”或“Reload”按钮。

  • 如何带新人(完全没有基础的新人)

    msnshow 发布于 2008-10-19 16:13:01

    对了带新人,不知道大家有什么看法?

    对于公司来说,希望新人能够尽快进入角色,能够参与实际工作

    相信很多公司都是这样的,新人进去后会安排一个老手带,但老手也没有固定的时间去带新人,也只是在自己的工作完成后,空闲的时候去教新人。都不会系统的去教,只是遇到问题的时候指导一下。

    如果像这样带新人,估计三五个月新人也学不到什么(除非自学能力特别强的),要在短时间内成长起来基本上是不可能

    本人的想法是这样的

    1、先让他了解工作的流程和规范

    2、将整个流程中肯定会用到的一些知识写成文档,发给他看

    3、与他沟通,了解看完这些东西后,他对工作的理解程度(主要是看他认识自己还需要补充哪些方面的知识,然后才好给一些建议)

    4、让他一起参与项目 (参与项目可尽量在他有基础之后,而不是太急于求成)

    有很多公司新员工进去了就是打杂的,老员工会把简单的工作丢给新员工来做,在这样的情况下,新员工很难成长起来

  • 使用 IBM Rational PurifyPlus

    msnshow 发布于 2008-04-07 13:25:38

    IBM® Rational® PurifyPlus™是一套测试工具集合,拥有三个工具-- PureCoverage、 Quantifyis 和 Purify,您可以用这套工具完成对代码覆盖率、性能和内存分析的运行时分析。它可以加强自动化测试工作,改善产品性能和质量。

    引言

    随着质量工程变得要求越来越高,能够使用更新的工具和方法对任何软件进行测试已经成为当务之急。

    对很多团队来说,测试自动化已经成为他们的测试工作的核心。然而,即使在存在稳定的自动化测试时,您仍然需要对它进行维护:增加新的测试、修改现有的测试以及调整测试脚本以跟上产品的变更。但是对于寻找如何能够得到更好的回报来说,所有这些努力是值得的。

    软件系统的规模和复杂性在持续增加,测试自动化也有相同的趋势。测试装备也要变得更大,能够进行更多的维护工作和更密切的监视工作,以便能够进行快速、可靠和更精确的测试。为了做到这些,您需要正确的工具。

    IBM Rational PurifyPlus 是三种工具:IBM Rational PureCoverage®、IBM Rational Quantify®和 IBM Rational Purify®的集合。这些产品非常适合测试人员(和开发人员)在软件测试期间使用。

    不只是测试自动化

    只完成测试自动化工作是不能下产品可以发布的结论的,您仍然需要在测试装备的设计、评审和维护方面进行合适的投资,否则您的客户仍然会找到那些漏到产品中的难以发现的缺陷。

    当给您(作为测试人员或者质量管理人员)安排一个测试任务时,您最好问自己以下的问题,以便更好地理解测试任务。

    • 我在这里做什么工作?
    • 有什么可用资源可以帮助我完成这个任务?
    • 如果我运行了所有针对应用程序计划的测试以后,则个任务是否就算完成了?
    • 自动化的测试是否包括了大多数的应用?
    • 有什么东西能够帮助我更彻底地测试,以便我能完成测试任务?

    理解应用程序在测试时的行为,以及收集有关自动化测试运行时的有价值的信息,能够极大地改善测试的效率。这也有助于减少遗漏到您的用户手里的缺陷的数量。

    在进行测试时,您应该集中在寻找最多的缺陷以便提高产品质量,而仅仅是完成测试任务。

    这就是运行时分析:分析运行的程序并收集数据,用来帮助您理解软件的行为和软件不同部件之间的关系。

    运行时分析

    在软件开发期间可以把运行时分析作为一项高级调试和测试技术来考虑。

    在运行应用程序期间,您可以收集和研究以下运行时数据:

    • 代码覆盖率
    • 性能瓶颈
    • 线程问题
    • 执行路径
    • 运行时跟踪
    • 内存错误和内存泄漏
    • 不正确的内存使用

    下面是有关 PurifyPlus 的组件是如何设计以帮助您的一些细节:

    • PureCoverage 用来进行代码覆盖率分析:它测量在所有测试用例中多少代码运行了,多少代码没有运行
    • Quantify 用来进行性能分析:它帮助分析应用程序的性能瓶颈
    • Purify 用来进行内存分析:它帮助寻找应用程序的内存泄漏和错误的内存使用,这些有可能导致应用程序崩溃。

    PurifyPlus for Microsoft® Windows® 可以用来分析 C++、Java™或者托管代码。它也可以集成在 Microsoft® Visual Studio® .NET IDE 中。

    PurifyPlus for Linux® 和 UNIX® 可以用来分析 C/C++ 和 Java 应用程序,这些程序构建在 Red Hat、SUSE、Solaris™、HP-UX 和 AIX 平台。但是本文只介绍 Windows 平台的测试自动化和分析。

    代码覆盖率分析

    假设您已经为需求规格说明书中的每个功能点写了测试用例,并在一个稳定的自动化环境中运行了这些用例,结果是令人鼓舞的。然而,用户仍然报告出测试用例中没有发现的问题。这时代码覆盖率分析就有用了,它可以扩展您的视野。代码覆盖率分析可以针对您的测试用例的有效性给出有价值的反馈。

    没有测试的代码

    即使有大量的自动化测试,总会有测试不到的代码路径。这就产生了用户发现问题的危险,而您却很容易地发现有问题的部分已经在测试中"覆盖"到了。这在引入了一些没有合适文档化、从而没有建立测试用例的特性时是有可能的。另一个可能性是新的代码可能引入了一些行为变更。

    进行代码覆盖率分析的主要步骤为:

    1. 自动化运行由 PureCoverage 处理过的应用程序
    2. 收集覆盖率数据
    3. 分析数据,找到哪些代码没有运行
    4. 增加测试用例,尽可能地覆盖没有运行的代码
    5. 运行增加了测试用例的自动化测试
    6. 确认增加的用例改善了您的覆盖率

    这里有一个使用 PureCoverage 运行 Java 自动化测试的例子。ClassicsJava 是一个示例程序,功能是对数据库中的音乐 CD 进行排序。这个程序是 IBM Rational Functional Tester 中的一个示例程序。首先使用以下命令由 PureCoverage 对程序进行处理:

    Coverage/java java.exe –jar ClassicsJavaA.jar

    然后运行这个程序的自动化测试脚本。完成排序后,中止程序。在图1中,被覆盖的方法加上了Hit标签,没有覆盖的则加上Missed标签。


    图1:PureCoverage 显示自动化测试程序的 hits 和 misses
    Module View tab with coverage and calls

    冗余度测试

    覆盖率分析也可以帮您找到测试用例是否有冗余:测试在代码的同一路径下反复运行,导致了不必要的时间延迟。另外它也可以帮助您确认测试数据。例如,一个新引进的代码变更需要您运行自动化测试以进行回归确认。这时您就需要检查覆盖率分析的数据,以帮您确定哪些自动化测试的子集需要运行,这样就可以让您在更短的时间内验证新的代码。

    为了深入到特定的方法内部,可以使用 PureCoverage 的 Annotated Source 特性。为了查看 Annotated Source 视图,双击方法。为了让这个特性工作,源代码必须可用。一种处理方法是使用开发人员的工作环境和软件,这样所有的源代码路径都可很容易地访问。图2显示出方法 Annotated Source 视图。正如同图1显示的那样,这个方法被遗漏了,因此代码行用红色字体显示。


    图2:PureCoverage 显示方法getCustomerNames() 的注释源视图
    missed method shows in red font

    性能分析

    性能分析是另外一种技术,它与 test harness 关联,给出有关应用程序的启发式的结果。在新 Build 的自动化测试明显变慢时,找到源代码内部发生了什么是至关重要的。导致变慢的原因是什么?这里有几个可能的原因:

    • 源代码中引入的变更:可能有不必要的模块导致了运行变慢,也可能是算法的改变影响了性能。
    • 测试代码的变更:您增加的用来改善代码覆盖率的测试用例可能导致变慢,也有可能这部分代码特别容易影响速度。
    • 测试数据的变更:大量的测试数据(或者不常见的数据)可能对代码产生压力,导致瓶颈。
    • 环境的改变或者连接问题:如果网络变慢,可能是您的硬件需要升级了。

    您不应该依赖于简单的“注意到”测试 运行了很长时间后才报告性能问题。建立一种测量性能的方法是有意义的。有多种方法来发现性能问题:

    • 在自动化测试时记录时间信息
    • 在测试脚本中生成记录时间的日志
    • 写专门的测试用来测量性能
    • 使用与测试协同工作的性能监控工具

    PurifyPlus 中的 Quantify 部件是一个性能监控的工具,您可以用它来收集性能数据。图3给出使用 Quantify 进行测试的 ClassicsJava 程序的一个例子。程序已经预先处理过,然后运行自动化测试(与 PureCoverage 的技术类似)。


    图3:Quantify生成的Callgraph显示出最花时间的方法
    details show method, class, and so on

    Quantify 收集有关哪些方法是调用者还是子调用者,以及这些调用花费了多长时间的信息。您可以检查这些信息以确定是否有可以优化的地方。

    在使用 Quantify 之前使用合适的过滤器是很重要的,否则将收集到太多的数据,很难进行分析。

    使用 Quantify 进行性能分析的步骤如下:

    1. 决定何时收集数据。自动化测试需要在不崩溃的情况下,能够稳定运行足够合理的时间。
    2. 设置基准,以对比特定数量的测试的期望的时间和实际的时间。
    3. 使用处理过的程序运行自动测试。
    4. 分析收集到的数据,确定哪些测试或者方法看起来有问题。
    5. 识别和研究这些问题,看看是否可以修正,然后重复整个过程。

    把性能分析的结果发给您的软件开发人员,让他们找找是否有办法阻止程序变慢。同时,您也要寻找是不是什么样的变更都会引起性能下降。如果是这样的话,基准就需要调整以便下一次任何更多的性能下降变得明显。

    进行这种类型的分析有更多的价值,因为它对自动化测试和被测试的应用程序都有利。有时它还可以由别的用途,例如,自动化测试运行的很慢,因此不能对被测程序进行更多的测试。测试可能整理为每天晚上进行一部分,而不是一次运行全部测试。这时,使用性能分析工具将有助于合理分配测试,因为工具可以和软件结合用来收集性能数据。您需要确定的是哪个工具最适合您的应用,以及如何用这个工具在自动化测试运行时收集到的数据计划时间花费。

    内存分析

    运行时内存错误和泄漏时应用程序中最难检测的问题之一。它可能有随机触发,并且相当难预期。Purify 能够帮助检查出这些类型的错误。Purify 非常容易使用,它有大量的命令行接口帮助您获得正确的信息。

    下面的列表是非常简单的错误内存使用的例子。他们看起来很简单,但是这种简单是具有欺骗性的。这是因为,在一个非常大的应用程序的小模块中,它们可能随机出现。如果这样的代码片段在应用程序运行期间一再地使用,问题就会累计,最终导致应用程序崩溃。


    列表1:内存泄漏
                    
    // Allocate memory 1K 
        (void) new char[1000];
    …..
    //Forget to de-allocate later in the program
    


    列表2:使用未初始化的内存
                    
      char *string1 = "start";
      char *string2 = malloc(10);
      
      length = strlen(string2);
    //string2 is not initialized like string1
    

    程序崩溃

    假如自动化测试运行的相当好,所有的测试都报告成功,性能也很好。然后,突然,出现了一个崩溃中止了测试过程。测试人员抱怨说,"运行测试时似乎有问题出现,应用程序有时候崩溃,但有时候却很好。"

    很多质量工程师都遭遇过这种情况,并且这种应用程序的崩溃很难重现。一个原因是这种使用错误内存的症状距离实际出问题的代码比较远。有时一开始即使使用了错误的内存,应用程序似乎也能正常工作。

    下面是一些最可能导致内存问题的情况:

    • 代码依赖和冲突 在不同模块在同一时间运行时发生
    • 错误的内存使用 在使用内存分配和释放的函数不匹配时发生
    • 数据结构不正确的初始化 超出了分配内存的边界

    在一些组织中,期望开发人员在检查他们的新代码前完成内存分析,以确信他们没有引入无意的错误。在测试应用程序时存在稳定的回归测试时,引入类似 Purify 的运行时错误检查工具就是比较明智的事情。工具既可以检查不同的模块,确保它们能够正确地共同工作,又可以揭示出在单独开发期间不明显的代码的依赖关系。

    使用 Purify

    为了在运行测试自动化时使用 Purify 进行内存分析,需要以下步骤:

    1. 把Purify合并到测试自动化中,以便它能够在后台尽量不受干扰地运行。这意味着您要用 purify /savetextdata 前缀运行您的程序,这与前面描述的 PureCoverage 和 Quantify 的技术类似。
    2. 收集运行时的信息。可能是泄漏、空指针或者错误的内存使用。
    3. 分析收集的所有数据,总结为一篇简单的文档,指出哪个测试或者代码部分导致了问题。然后把这些信息传给开发人员。
    4. 在问题解决后,重新运行 Purify 进行测试,并报告结果。

    对于 C 和 C++ 程序看来说,Purify 的报告是类似 MLK(Memory Leak,内存泄漏),MPK(Potential Memory Leak,潜在的内存泄漏),ABR(Array Bounds Read,数组边界读取)等等的警告、错误和信息。每个这种 Purify 的缩写都表示一种应用程序中出现的内存错误。


    图4:一个测试 C++ 应用程序的自动化报告
    Data Browser Error View

    对于 Java 和其它托管代码的程序,Purify 收集哪些方法或者类负责分配最多的内存,如图 5 所示:


    图5:在 Purify 下运行 classicsjava 自动化测试的 Function Detail 视图
    Purify'd java.exe

    这样可以找到应用程序执行期间全部内存使用的图形,对于找到哪些对象是不需要的非常有用。

    使内存分析成为习惯

    在测试自动化中增加内存分析工具将会增加组织的总体效率。测试自动化已经用开发组可能不知道的方法检查了他们的代码。另外在您使用内存分析工具收集相关数据时,可以减少开发人员花在调试和寻找问题所在的时间。

    有时,依赖于您的组织的技能水平和时间限制,更可取的方法是收集运行时数据然后直接传给开发组进行分析和研究。寻找内存问题不需要一定有系统崩溃的情况发生。只要源代码发生变化,分析可以一直进行,以看看有什么发现。

    了解何时使用哪个工具的最好的组合

    我们作为质量工程师,没有必要为了进行运行使分析而等着问题出现。事实上,一个好的习惯是假设应用程序存在问题,然后进行运行时分析以找到问题所在。

    您发现性能和内存瓶颈越早,就能够越早地修复它。有些问题需要重新编程并改变模块的全部代码逻辑。有些编程语言提供收集运行时更多信息的特性(如 assert 和异常处理)。更多的程序员在他们应用程序的调试版本中使用多种寻找内存问题的方法。他们甚至在他们的程序中写入测量性能的代码。

    调试和运行时分析

    然而,在调试和运行时分析之间仍然是有差异的。调试经常是由开发人员运行的,用来在运行他们自己的模块期间帮助他们找到小一些的问题。但是运行时分析则是一种应用于整个应用程序的方法,它可以由测试人员或者开发人员进行,或者二者都进行。

    覆盖率分析在您使用自动化时更有效率。为了测量测试花了多少时间,自动化测试应该是可用的。当然,您完全可以使用手工测试来完成覆盖率分析。

    在特定的时间进行那种类型的分析更有效果?对这个问题,一个简单的指导是看您发现的用户问题的类型,然后确定他们属于下面三个类别的哪一种或哪几种,再选择需要进行的分析组合。

    • 发现的问题没有被测试过:代码覆盖率问题
    • 与大量数据或者特定的数据有关的速度变慢的问题:性能问题
    • 在用户使用时程序死机或者突然崩溃:内存问题

    在开发人员和测试人员之间建立桥梁

    共同使用测试自动化和运行时分析是一个明智的策略,这样可以有助于发布高质量的软件的最终目标。它可以最小化您的用户发现的缺陷的数量,同时增加您的开发人员和测试人员的自信心。

    在运行分析之前,突然出现的未预料的系统崩溃将会给您的团队极大的挫折。然后他们会受益于对软件行为和相关的复杂性的更深刻的理解。有可行修正全部问题,也可能不能完全修正,或者完全改善测试的覆盖率,但是对问题的理解有助于您对未来的规划。

    使用 test harness 作为可用工具的一种,然后与分析工具组合起来,可以帮助您找到那些隐藏的问题。运行时分析可以在软件开发生命周期的任何一点完成,即使没有自动化测试的存在也可以进行。它甚至可以在全部的代码还不可用的时候进行。开发人员可以使用运行时分析工具和技术识别和解决他们调试和单元测试中发现的问题。

    这个方法有助于在开发人员和测试人员之间建立桥梁。他们可以共同工作,发现软件中的问题,而不是由用户发现问题。这也可以帮助改善开发人员和测试人员之间的通讯。测试人员可以用“白盒”的方式深入到源代码中,更好地理解他们测试的软件。另外,在测试人员报告他们运行时发现的问题时(不管是性能问题、内存问题还是代码覆盖),他们都可以给开发人员以实际的反馈,告诉他们应该修改什么地方以提高质量。

    致谢

    作者在这里感谢 David Lofgren 对本文的审阅工作,并感谢 Don Nguyen 帮助准备了 Java 示例程序。



    参考资料

    学习

    获得产品和技术

    讨论


    关于作者

    Poonam Chitale 在 IBM Rational Software 的 PurifyPlus 组担任软件质量工程师。她自 1998 年加入 Rational 以来一直从事有关运行时分析的测试项目。Poonam 是印度 Pune 大学的计算机硕士。

  • web_reg_find函数的说明及其例子

    msnshow 发布于 2008-12-25 13:45:28

       web_reg_find()函数

        该函数的作用是“在缓存中查找相应的内容”,常用参数及含义如下:

      web_reg_find("Search=Body",   //定义查找范围

                      "SaveCount=ddd",             //定义查找计数变量名称

                      "Text=aaaa",                  //定义查找内容

                      LAST);
                  

        使用该函数注意以下事项:

        1、  位置

        该函数写在要查找内容的请求之前,通常情况下写在如下六个函数之前:

        Web_castom_request();web_image();web_link();web_submit_data();web_submit_form();web_url()

        2、  使用技巧

        在该函数的参数中有个“SaveCount”,该参数可以记录在缓存中查找内容出现的次数,我们可以使用该值,来判断要查找的内容是否被找到,下面举个例子来说明:(引用LR的帮助中的例子)

       // Run the Web Tours sample

               web_url("MercuryWebTours",

                      "URL=http://localhost/MercuryWebTours/",

                      "Resource=0",

                      "RecContentType=text/html",

                      "Referer=",

                      "Snapshot=t1.inf",

                      "Mode=HTML",

                      LAST);

        // Set up check for successful login by looking for "Welcome"

               web_reg_find("Text=Welcome",

                      "SaveCount=Welcome_Count",

                      LAST);

        // Now log in

               web_submit_form("login.pl",

                      "Snapshot=t2.inf",

                      ITEMDATA,

                      "Name=username", "Value=jojo", ENDITEM,

                      "Name=password", "Value=bean", ENDITEM,

                      "Name=login.x", "Value=35", ENDITEM,

                      "Name=login.y", "Value=14", ENDITEM,

                      LAST);

        // Check result

               if (atoi(lr_eval_string("{Welcome_Count}")) > 0){    //判断如果Welcome字符串出现次数大于0

                      lr_output_message("Log on successful.");  }//在日志中输出Log on successful

                else{ //如果出现次数小于等于

                      lr_error_message("Log on failed"); //在日志中输出Log on failed

                      return(0);         }
  • LoadRunner使用技巧- IP欺骗的使用

    msnshow 发布于 2007-11-03 11:06:54

    设置IP欺骗的原因

     

    1、  当某个IP的访问过于频繁,或者访问量过大是,服务器会拒绝访问请求,这时候通过IP欺骗可以增加访问频率和访问量,以达到压力测试的效果。

    2、  某些服务器配置了负载均衡,使用同一个IP不能测出系统的实际性能。LR中的IP欺骗通过调用不同的IP,可很大程度上的模拟实际使用中多IP访问和并测试服务器均衡处理的能力。

    IP地址的设置

           IP地址的设置较为简单,可直接在本地连接中增加IP,或者通过LR自带的工具“IP wizard”设置,当然也可以使用其它软件设置。唯一需要注意的就是注意设置的IP的有效性。

    “选项”中的IP设置

    使用“选项”对话框中的“常规”选项卡,可以选择IP地址模式。只有在专家模式下操作 Controller 时,才显示该选项卡。

    要设置常规专家模式设置,请执行下列操作:

    1.     选择“工具”>“选项”。将显示“选项”对话框。选择“常规”选项卡。

    2.     选择多个 IP 地址模式。

    需要注意的是,这里的IP地址模式和运行时设置中的常规设置的不同,会导致IP欺骗失效。具体该怎么设置,这里就不讲了,很简单的东西。

    启用IP欺骗

      Controller 启用多个 IP 地址

        定义多个 IP 地址后,您就可以设置一个选项,让 Controller 使用该功能。

        要从 Controller 启用多个 IP 地址,请执行下列操作:

    Controller“设计”视图中,选择“场景”>“启用 IP 欺骗器”。

    注意:必须在连接到负载生成器之前选择该选项。

    IP欺骗功能验证

           IP欺骗已经设置了,但是是不是有效呢?通常会有这样的疑问。下面我们通过一个简单的试验,来验证是否有效。

           在脚本的Action()部分增加如下代码:

      &nsp;    char * ip=lr_get_vuser_ip();

           if(ip)

                  lr_vuser_status_message("The ip address is %s",ip);

           else

                  lr_vuser_status_message("IP spoofing disabled");

     

    然后通过控制器设置并运行场景,在Controller's Vuser 窗口中,大家可以看到如下的结果:

          

    遇到问题总结:

    启动IP向导的时候出现:

    ---------------------------
    IP Wizard
    ---------------------------
    The IP wizard does not support DHCP-enabled network cards.

    Your cards are either DHCP-enabled or configured with invalid settings.

    Please contact your system administrator.

    Exiting...

    是因为不能用动态IP

  • Loadrunner message函数详细分析

    msnshow 发布于 2007-11-03 11:11:08

    Loadrunner提供了若干message函数,以在脚本回放中和脚本运行中,对外输入信息,主要的函数有:
    【lr_message】
     int lr_message (const char *format, exp1, exp2,...expn.);
     中文解释:lr_message函数将信息发送到日志文件和输入窗口。在VuGen中运行时,输入文件为output.txt。

    【lr_log_message】
     int lr_log_message (const char *format, exp1, exp2,...expn.);
     中文解释:lr_log_message函数将消息发送到Vuser或代理日志文件(取决于应用程序),而不是发送到输出窗口。通过向日志文件
        发送错误消息或其他信息性消息,可以将该函数用于调试。

    【lr_error_message】
     int lr_error_message (const char *format, exp1, exp2,...expn. );
     中文解释:lr_error_message函数将错误消息发送到输出窗口和Vuser日志文件。要发送不是特定错误消息的特殊通知,请使用lr_output_message。

    【lr_output_message】
     int lr_output_message (const char *format, exp1, exp2,...expn.);
     中文解释:lr_output_message函数将带有脚本部分的行号的消息发送到输出窗口和日志文件。

    【lr_vuser_status_message】
     int lr_vuser_status_message (const char *format);
     中文解释:lr_vuser_status_message函数向控制器或优化模块控制台的vuser窗口的“状态”区域发送字符串。它还将该字符串发送
        到vuser日志。从VuGen运行时,消息被发送到output.txt。

    下面大家看例子:
    Action()
    {
     int i,j,k;
     char *message;
     j = k = 1000;

     message = "信息";
     lr_message("****************输出区域开始*****************");
     lr_message("   lr_message   %s:十进制=%d,八进制=%o,十六进制=0x%x",message,j,j,j);
     lr_log_message("   lr_log_message   %s:十进制=%d,八进制=%o,十六进制=0x%x",message,j,j,j);
     lr_error_message("   lr_error_message   %s:十进制=%d,八进制=%o,十六进制=0x%x",message,j,j,j);
     lr_output_message("  lr_output_message   %s:十进制=%d,八进制=%o,十六进制=0x%x",message,j,j,j);
     lr_message("****************输出区域结束*****************");
     for (i=1;i<6;i++)
     {
      k += 1000;
      lr_think_time (5);
      lr_vuser_status_message("第%d次:%s,十进制=%d,八进制=%o,十六进制=0x%x",i,message,k,k,k);
     }
     return 0;
    }
    例子说明:
    1、message系列的函数参数格式和c语言中的printf格式是完全相同的。
    2、格式化输入标志符号"%",想必大家也比较熟悉。其中%d是十进制,%o是八进制,%x是十六进制,%s是字符;还有%g、%u、%c等,自己去查。
    3、回放这个脚本后,进入脚本根目录查看mdrv.log,所有输出都可以在这里找到。
    4、lr_error_message回放日志中显示的是红色的字体,且显示语句所在行号;同时,如果脚本在controllor中运行时,会生成一个error信息。
    5、lr_vuser_status_message会在controllor的vuser list的status列中显示,controllor每5秒刷新一次。
    6、当然,也支持转义字符的使用,列表如下:
    \a 铃声(警告)
    \b Backspace 键
    \f 换页
    \n 换行
    \r 回车
    \t 水平制表符
    \v 垂直制表符
    \' 单引号标记
    \" 双引号标记
    \\ 反斜杠
    \? 文本问号
    \ooo ASCII 字符 - 八进制
    支持的转换字符有:
    %a ASCII 表示形式
    %BX 大端(网络顺序)十六进制
    %BO 大端(网络顺序)八进制
    %BD 大端(网络顺序)十进制
    %LX 小端十六进制
    %LO 小端八进制
    %LD 小端十进制

    ==============================================================

    此外,loadrunner还提供了在脚本中控制runtime-setting的log设置的函数。
    【lr_debug_message函数组】
    int lr_debug_message (unsigned int message_level, const char *format, ... );
     中文解释:lr_debug_message函数在指定的消息级别处于活动状态时发送一条调试信息。如果指定的消息级别未出于活动状态,则不
        发送消息。您可以从用户界面或者使用lr_set_debug_message, 将处于活动状态的消息级别设置为MSG_CLASS_BRIEF_LOG
        或MSG_CLASSS_EXTENDED_LOG。要确定当前级别,请使用lr_get_debug_message。

    unsigned int lr_get_debug_message ( );
     中文解释:lr_get_debug_message函数返回当前的日志运行时设置。该设置确定发送到输出端的信息。日志设置是使用运行时设置对
        话框或通过使用lr_set_debug_message函数指定的。

    int lr_set_debug_message (unsigned int message_level, unsigned int on_off);
     中文解释:lr_set_debug_message函数设置脚本执行的调试消息级别message_lvl。通过设置消息级别,可以确定发送哪些信息。 启
        动设置的方法是将LR_SWITCH_ON作为on_off传递,禁用设置的方法是传递LR_SWITCH_OFF。

    参数message_level说明:
    【日志级别】====【C语言标志】====【值】====【Runtime-setting - Log操作】 
    【Disabled】====【LR_MSG_CLASS_DISABLE_LOG】====【0】====【不勾选Enable logging】 
    【Brief】====【LR_MSG_CLASS_BRIEF_LOG】====【1】====【勾选Standard log】
    【Extended Log】====【LR_MSG_CLASS_EXTENDED_LOG】====【16】====【勾选Extended log】
    【Result Data】====【LR_MSG_CLASS_RESULT_DATA】====【2】====【勾选Data returned by server】
    【Parameter Substitution】====【LR_MSG_CLASS_PARAMETERS】====【4】====【勾选Parameter substitution】 
    【Full Run-Time Trace】====【LR_MSG_CLASS_FULL_TRACE】====【8】====【 勾选 Advanced trace】
    【Only on error】====【LR_MSG_CLASS_JIT_LOG_ON_ERROR】====【512】====【勾选send messages only when an error occurs】 

    参数on_off说明:
    【LR_SWITCH_ON】启用设置
    【LR_SWITCH_OFF】禁用设置


    看下面的小例子:
    Action()
    {
     int log_leavl;
     log_leavl = lr_get_debug_message();
     lr_error_message ("当前是:%d",log_leavl);
     return 0;
    }
    当我设置只有错误信息(error)打印【勾选send messages only when an error occurs】,例子运行结果是:当前是:513;
    为什么不是512呢,我发现我实际选择的是【Enable logging + send messages only when an error occurs】,按上面的
    参数说明,就是【1+512】,也就是513了;因此:
    lr_get_debug_message返回的int数其实是所有勾选操作的代表值相加!


    再看下面设置的例子:

    Action()
    {
    //设置runtime-setting的日志选项【不勾选Enable logging】
     char *a;
     a = "ABC";
     lr_set_debug_message (LR_MSG_CLASS_EXTENDED_LOG |LR_MSG_CLASS_PARAMETERS,LR_SWITCH_ON);
     //打开Runtime-setting Log 的Parameter substitution设置
     lr_debug_message(LR_MSG_CLASS_PARAMETERS,"打开参数保存的系统日志");
     lr_save_string("aa",a);
     lr_debug_message(LR_MSG_CLASS_PARAMETERS,"关闭参数保存的系统日志");
     lr_set_debug_message (LR_MSG_CLASS_EXTENDED_LOG |LR_MSG_CLASS_PARAMETERS,LR_SWITCH_OFF);
     //关闭Runtime-setting Log 的Parameter substitution设置

     return 0;
    }
    因为设置了runtime-setting不打印任何日志,所以正常运行脚本应该没有任何日志输出;
    但是使用lr_set_debug_message函数打开了日志的设置(输出保存参数操作的日志)
    因此脚本运行到lr_save_string("aa",a)时,就输出了日志如下:

    打开参数保存的系统日志
    Action.c(7): Notify: Saving Parameter "ABC = aa"
    关闭参数保存的系统日志

    ==============================================================

    参考资料:Loadrunner 8.1 函数手册英文(Virtual User Generator - Help -Function Reference)

    希望大家一起努力把lr用熟用透!!!

  • 上一篇文章:
  • 如何更好的使用LR进行测试

    msnshow 发布于 2007-09-04 15:04:03

    LR很强大,因为它功能很多,但用起来也会相对比较麻烦,喜欢简单的人都喜欢用WAS进行WEB应用测试,本人使用LR也不是很久,使用它测试过几个项目,每做一次就会有所收获,到现在发现之前自己浪费了不少的时间在弄脚本的时候,总结起来与大家一起分享,对于LR高手来说就是小菜一碟了,新人可以看看

    1、不要盲目的开始录制脚本(最好先将要录制的脚本URL弄个表列出来,并加上注释)

    2、脚本录制好后不要急于参数化(参数化前将要使用的参数先列出来,适当减少参数个数)

    3、取数据时要注意各数据间的关联(不注意关联,会导制取出来的数据与事实不符)

    4、需要记录取数据所使用的SQL语句等,并添加注释(以便以后使用,或出现问题时,查找原因)

    5、记录应用配置,每次测试前清空以前的LOG记录,测试完成记录本次测试相关数据

    6、完成测试后,进行对比分析,得出本系统的最佳配置

     

  • (转)测试总结和报告

    sll101010 发布于 2008-09-24 16:15:56

    (转自http://www.51testing.com/?166909/action_viewspace_itemid_83440.html)

    测试人员的工作通常并不像开发人员那样能直接体现出来,让大家一目了然。开发人员做的是建设性的工作,如开发了哪些功能,写了几行代码,设计了几个类,都能直观地看到,而且,通过软件能很鲜活地演示开发人员的工作成果。
            但是测试人员的工作相对隐蔽一点,测试人员做的是破坏性的工作,并且没有很多可以直观体现测试人员贡献的东西。笔者曾经听到公司人事部的一位同事说:“你们做测试的真好,整天坐在那里”。当然,这是外行人看内行时说的话,但是给笔者的一个启示是:测试人员需要更多地表现自己,展现自己的工作成果。
            说明:由于缺陷列表太细、太大,测试用例过于专业,很多人对其不感兴趣,因此测试报告能很好地展示自己的工作状况,测试报告是提供给很多人看的一份文档。
            下面是一个项目的测试报告的纲要:
    1 简介
    1.1 编写目的
    1.2 项目背景
    1.3 术语和缩略词
    1.4 参考资料
    2 目标及范围
    2.1 测试目的及标准
    2.2 测试范围
    3 测试过程
    3.1 测试内容
    3.2 测试时间
    3.3 测试环境
    3.4 测试方法及测试用例设计
    4 测试情况分析
    4.1 测试概要
    4.2 测试用例执行情况
    4.3 缺陷情况
    4.4 测试覆盖率分析
    4.5 产品质量情况分析
    5 测试总结
    5.1 测试资源消耗情况
    5.2 测试经验总结
    6 附件
    附件1 测试用例清单
    附件2 缺陷清单
    一、缺陷分类报告
            缺陷分类报告是测试报告的重要组成部分,可以再细分为:缺陷类型分布报告、缺陷区域分布报告和缺陷状态分布报告等。
    1.缺陷类型分布报告
            缺陷类型分布报告主要描述缺陷类型的分布情况,看缺陷属于哪些类型的错误。这些信息有助于引起开发人员的注意,并分析缺陷为什么会集中在这种类型。例如,如果缺陷主要是界面类型的,如界面提示信息不规范、界面布局凌乱等问题,那么就要讨论是否需要制定相应的界面规范,让开发人员遵循,从而防止类似问题的出现。
    缺陷类型分布报告一般用饼图或柱状图显示。如图7.29所示,用饼图表示了几种类型的缺陷各自所占的比例。2.缺陷区域分布报告
            缺陷区域分布报告主要描述缺陷在不同功能模块出现的情况,这些信息有助于开发人员分析为什么缺陷会集中出现在某个功能模块。例如,如果缺陷主要集中在单据的审批过程中,那么就要分析是否是审批流程调用的工作流接口设计不合理。
            缺陷区域分布报告一般使用饼图或柱状图表示。如图7.30所示,用柱状图表示缺陷分布在不同的功能模块的个数。                                                     
    3.缺陷状态分布报告
            缺陷状态分布报告主要描述缺陷各种状态的比例情况,例如Open、Fixed、Closed、Reopen、Rejected、Delay的Bug分别占了百分之多少。这些信息有助于评估测试和产品的现状:
            如果Open的Bug比例过高,则考虑让开发人员暂停开发新功能,先集中精力修改Bug;
            如果Fixed状态的Bug很多,则考虑让测试人员暂停测试新功能,先集中精力做一次回归测试,把修改的Bug验证完;
            如果Closed的Bug居多,则可能意味着功能模块趋于稳定;
            如果Reopen的Bug比较多,则需要分析开发人员的开发状态,是什么原因造成缺陷修改不彻底;
            如果Rejected的Bug比例过高,则要看开发人员与测试人员是否对需求存在理解上的分歧;
            如果Delay的Bug比例过高,则要考虑这个版本是否满足用户的要求,是否缺少了太多应该在这个版本出现的功能特性。

            缺陷状态分布报告一般使用饼图或柱状图表示。如图7.31所示,用饼图表示各种状态的缺陷个数以及所占的百分比。

        注意:其他的缺陷分类报告也可以写到测试报告中,例如,严重级别分类报告、优先级别分类报告、负责人分类报告、发现人分类报告、版本分类报告等。但是要注意,应该用这些分类报告来说明问题,而不要用来指责别人,例如使用负责人分类报告来嘲笑某个开发人员是“Bug大王”等。
    二、缺陷趋势报告
            缺陷趋势报告主要描述一段时间内的缺陷情况。如果项目管理比较规范,缺陷管理和测试流程比较正常的话,缺陷趋势报告还可以用来估算软件可发布的日期。
    例如,如图7.32所示的缺陷趋势图,表示在2001年9月3号至2001年9月24号之间的Bug状态变            从图7.32可以看出,Open状态的Bug在不断地增加,Fixed状态的Bug在2001年9月16号后开始骤然下降,这表示,这段时间开发人员有可能在开发几种新的功能,忽略了Bug的修改工作。
            发现并录入Bug,与修改并关闭Bug是一对互相对冲的两个变量,软件产品就是在这样此消彼涨的过程中不断完善和改进质量的。有经验的项目经理和测试人员会非常关注这样的发展曲线,从而判断项目产品的质量状态和发展趋势。笔者曾经在某个项目中与一位项目经理在项目的待发布阶段每天都在观察缺陷趋势图,这位项目经理甚至把它戏称为软件产品的“股市”技术图。
            但是确实能从这些图中看出一个产品的质量趋势,如果项目管理得比较规范的话,甚至可以从这些图的某些关键点推算出可发布版本的日期。在微软的项目管理中,把这种关键点称为零Bug反弹点。例如,图7.33中就有几个零Bug反弹点(用圆圈圈住的地方)。

           项目在第一次达到零缺陷,即所有Bug(或者大部分Bug)都基本处理掉了,没有发现新的Bug时,还不能马上发布版本,因为Bug会反弹。由于缺陷的“隐蔽特性”和“免疫特性”,第一个零缺陷点是一个质量安全的假像,测试人员很快就会在新版本中发现更多的Bug,有些项目甚至要到第三个或第四个零Bug点才能安全地发布,这取决于项目的实际控制方式


     

  • 描述测试用例设计的完整过程

    sll101010 发布于 2008-10-06 12:28:57

    首先根据需求文档、概要设计、测试计划、测试方案 细分出各功能模块的测试项,再根据各测试项,按照概要设计、详细设计以及测试方案中测试的覆盖率 细分出测试子项,最后按照测试子项、根据测试用例的设计方法(因果图、边界值、等价类等的设计方法)书写测试用例。
  • 锚点链接测试

    sll101010 发布于 2008-12-22 15:46:55

    <html>
    <title>锚点链接测试</title>
    <body>
    <ul>
    <li><a href="#gone">过去</a></li>
    <li><a href="#now">现在</a></li>
    <li><a href="#future">将来</a></li>
    </ul>
    <p>
    TTTTTTTTTTTTTTTTTTTTTTT<br>
    TTTTTTTTTTTTTTTTTTTTTTT<br>
    TTTTTTTTTTTTTTTTTTTTTTT<br>
    TTTTTTTTTTTTTTTTTTTTTTT<br>
    TTTTTTTTTTTTTTTTTTTTTTT<br>
    TTTTTTTTTTTTTTTTTTTTTTT<br>
    TTTTTTTTTTTTTTTTTTTTTTT<br>
    TTTTTTTTTTTTTTTTTTTTTTT<br>
    TTTTTTTTTTTTTTTTTTTTTTT<br>
    TTTTTTTTTTTTTTTTTTTTTTT<br>
    TTTTTTTTTTTTTTTTTTTTTTT<br>
    TTTTTTTTTTTTTTTTTTTTTTT<br>
    TTTTTTTTTTTTTTTTTTTTTTT<br>
    TTTTTTTTTTTTTTTTTTTTTTT<br>
    </p>
    <p><a name="gone"></a>
    GONE
    <p>
    gone info<br>
    gone info<br>
    gone info<br>
    gone info<br>
    gone info<br>
    gone info<br>
    gone info<br>
    gone info<br>
    gone info<br>
    gone info<br>
    gone info<br>
    gone info<br>
    gone info<br>
    gone info<br>
    gone info<br>
    gone info<br>
    gone info<br>
    gone info<br>
    gone info<br>
    gone info<br>
    gone info<br>
    gone info<br>
    gone info<br>
    gone info<br>
    gone info<br>
    gone info<br>
    gone info<br>
    </p>
    </p>
    <p><a name="now"></a>
    NOW
    <p>
    now info<br>
    now info<br>
    now info<br>
    now info<br>
    now info<br>
    now info<br>
    now info<br>
    now info<br>
    now info<br>
    now info<br>
    now info<br>
    now info<br>
    now info<br>
    now info<br>
    now info<br>
    now info<br>
    now info<br>
    now info<br>
    now info<br>
    now info<br>
    now info<br>
    now info<br>
    now info<br>
    now info<br>
    now info<br>
    now info<br>
    now info<br>
    </p>
    </p>
    <p><a name="future"></a>
    FUTURE
    <p>
    future info<br>
    future info<br>
    future info<br>
    future info<br>
    future info<br>
    future info<br>
    future info<br>
    future info<br>
    future info<br>
    future info<br>
    future info<br>
    future info<br>
    future info<br>
    future info<br>
    future info<br>
    future info<br>
    future info<br>
    future info<br>
    future info<br>
    future info<br>
    future info<br>
    future info<br>
    future info<br>
    future info<br>
    future info<br>
    future info<br>
    future info<br>
    </p>
    </p>
    </body>
    </html>
  • EclipseMyEclipse的配置

    sll101010 发布于 2009-01-13 11:57:53

    【转贴】EclipseMyEclipse的配置----作者:平平淡淡

    Eclipse+MyEclipse的配置
     
     
     
    作者:平平淡淡
    发布时间: 2005-12-7 15:27:00
     
    地址:http://blog.yeeyoo.com/user1/126102/archives/2005/250841.shtml
     
     
    根据我自己的使用环境做了修改.
     
    一、安装j2sdk1.5,设定环境变量。    我的安装目录是 D:\j2sdk 。 所以设定环境变量如下:     操作: 我的电脑(右键) ----> 系统特性----> 高级----> 环境变量: 
    (此处原文有图片,不懂如何设置的朋友可以产看原文)设定环境变量为:   1. (新建)JAVA_HOME: D:\j2sdk   2. (新建)CLASSPATH: .;D:\j2sdk\lib\dt.jar;D:\j2sdk\lib\tools.jar (注意:点号不能省略,表示当前目录)   3. 编辑PATH的变量值,在后面加上 ;%JAVA_HOME%\bin (注意:要有分号隔开)    到这里,j2sdk安装完毕,用命令简单测试一下: java -version 
    二、安装Tomcat5.0 去下载一个Tomcat的zip版, 我用的是 jakarta-tomcat-5.0.28.zip , 不下安装版的目的是可以使用多个Tomcat。 三、安装Eclipse3.1 下载地址:http://www.eclipse.org/downloads/index.php 找到下面的页面直接解压缩就可以用了   到这里, Eclipse3.1 安装完毕。
    四、安装 MyEclipse4.1.1 (MyEclipse不是免费的,所以我们先下载一个试用版,再去网上下载一个注册机)  下载版本: MyEclipse Enterprise Workbench 4.1.1 GA for Windows 98/2000/XP (8/29/2005)
     
    下载完成后,开始安装: 1. 选择你的eclipse所在目录(根目录 如:E:\eclipse),其它都点下一步,默认安装。
     
    2.安装完毕之后,找到myeclipse的安装目录
     
    3. 将features和plugins这2个目录复制出来。
     
    4. 将第3步复制的features和plugins这2个目录下的文件, 拷贝到 Eclipse的相应目录下。
     
    解释一下上面做的原因: 因为myeclipse是eclipse的插件,所以只要把features和plugins这2个目录的内容拷贝到eclipse的相应目录,eclipse会自动认出这些插件。 到这一步,myeclipse算是安装完毕
     
    五、破解myeclipse4.1.1 1.去google搜索下载一个注册机。MyEclipse 4.0 以上版本(http://www.blogjava.net/Files/oksonic/MyEclipseKeyGen4.X.rar
    MyEclipse 3.8.x 以上版本(http://www.blogjava.net/Files/oksonic/MyEclipse_key3.x.rar
    2.解开注册机,可以看到有三个文件.运行MyEclipseKeyGen.exe. 选择合适的MyEclipse版本随便输入一个名字,然后生成注册码. 把Name和Key都记录下来留着一会使用.
    3.运行eclipse.exe, 设定同目录下的workspace
     
    4.这个时候myeclipse插件应该已经被识别出来如果不能识别请在仔细检查上述步骤.并通过goole解决.
     
    5. 点击 Window ----> Preferences ----> Subscrīption ----> Enter Subscrīption, 输入注册码,破解myeclipse
     
    到这里,myeclipse破解完毕。
  • svn的使用

    sll101010 发布于 2009-02-24 14:58:14

    使用远程登录,d:/s1_dobize,直接update即可。如果在d:/s1_dobize修改了,就commit,否则就不用commit.

    每次先update,再将更新包覆盖到源文件,再commit.

  • 如何使用Hibernate(用MyEclipse)

    sll101010 发布于 2009-04-14 17:17:08

    How to use Hibernate: 如何使用Hibernate(用MyEclipse)

    step1.  Create Hibernate.cfg.xml          创建Hibernate的配置文件 !!
    step2.  Create tables in Database         创建表单(在数据库里)
    step3.  Create PO(Persistent Objects)     创建持久化类
    step4.  Create XXX.hbm.xml                创建对象-关系映射文件  !!!
    step5.  Create DataAccess Objects         通过Hibernate API编写访问数据库的代码

    -------------------------------------------
    step1.  Create Hibernate.cfg.xml        创建Hibernate的配置文件

    <?xml version='1.0' encoding='UTF-8'?>
    <!DOCTYPE hibernate-configuration PUBLIC
              "-//Hibernate/Hibernate Configuration DTD 2.0//EN"
              "http://hibernate.sourceforge.net/hibernate-configuration-2.0.dtd">

    <!-- Generated by MyEclipse Hibernate Tools.                   -->

    <hibernate-configuration>

      <session-factory>
     <!-- mapping files -->
     <property name="connection.autocommit">true</property>
     <property name="myeclipse.connection.profile">mysql</property>
     <property name="connection.url">
      jdbc:mysql://localhost:3306/bookstoresql
     </property>
     <property name="connection.username">root</property>
     <property name="connection.password"></property>
     <property name="connection.driver_class">
      com.mysql.jdbc.Driver
     </property>
     <property name="dialect">
      net.sf.hibernate.dialect.MySQLDialect
     </property>
     
       </session-factory>
    </hibernate-configuration>

    ------------------------------------------------
    step2.  Create tables in Database      创建表单在数据库里

     create table book( id bigint not null auto_increment, title varchar(50) not null, price  double,  description varchar(200), primary key(id));

    注意: 用Mysql 数据库, table Type 应设为InnoDB 

    ----------------------------------------------------------
    step3. Create PO(Persistent Objects)  创建持久化类

          public abstract class AbstractBook implements Serializable
          public class Book   extends AbstractBook

      用MyEclipse 自动从数据库表单生成的两个类(一个抽象, 一个具体)
      如果自己手工建, 可以只生成的一个具体类

    ---------------------------------------------------
    step4. Create XXX.hbm.xml             创建对象-关系映射文件

    Book.hbm.xml         

    <hibernate-mapping package="com.liu.hibernate.po">

        <class name="Book" table="book">
            <id name="id" column="id" type="long">
                <generator class="increment"/>
            </id>
     
            <property name="isbnNumber" column="isbnNumber" type="string"  not-null="true" />
            <property name="title" column="title" type="string"  not-null="true" />
            <property name="price" column="price" type="double" />
            <property name="description" column="description" type="string" />
        </class>
       
    </hibernate-mapping>

    在一般JAVA项目里,  配置文件放的路径为:      你的项目名称/hibernate.cfg.xml
                                      or 你的项目名称/hibernate.properties
                                                你的项目名称/你的包名/xxx.hbm.xml
                  你的项目名称必须设置在classpath中


    在Web 项目里,  配置文件放的路径为:        你的Web应用名/WEB-INF/classes/hibernate.cfg.xml
                                             or   你的Web应用名/WEB-INF/classes/hibernate.properties
                                              你的Web应用名/WEB-INF/classes/你的包名/xxx.hbm.xml

    --------------------------------------------------------
    step5.  Create DataAccess   通过Hibernate API编写访问数据库的代码

      * 你可以用MyEclipse工具生成的HibernateSessionFactory来设定配置, 并获得Session
                          
          public void  addBook(Book b){
          Transaction tx=null;
       
          try{
           Session sess= HibernateSessionFactory.currentSession();
              tx=sess.beginTransaction();

               //do some work
        sess.save(b);  
                    
        tx.commit();  ////!!!!!!save book in DB       
          }catch(Exception e){             
                       e.printStackTrace();
                if(tx!=null){
                 try{
                  tx.rollback();
                 }catch (Exception ee){  ee.printStackTrace();}   
                }         
          }finally{
           try{
             HibernateSessionFactory.closeSession();
           }catch (Exception ee){  ee.printStackTrace();}
          }
          }

  • vi常用命令(转)

    sll101010 发布于 2009-05-23 16:49:16

    使用vi很久了,回想起当时学习vi时的经历,觉得有必要记录下vi常用命令,希望对大家有用。

    当时学习vi,主要是在书上或网上看使用命令,然后实践。很多书上都提到了vi的使用,但写的比较笼统,有些命令没有提到。不常用的命令提到了,常用的命令反而没提到,反而有点了混淆视听。而网上网友们提供的vi命令又太过于细了,不管常用不常用,提出来一堆命令,以至于学习没有重点。

    基于此,我觉得有必要记录下vi常用命令,希望对大家有用。

    (注:这里只记录我认为常用的命令)

    vi有三种工作模式:指令模式、编辑模式和命令模式。

    我们从打开vi说起,这样可以确定下学习环境,也方便学习者实践。

    打开vi,当前模式即为指令模式,此时可以按a, i, 或o进入编辑模式,或按:(冒号)进入命令模式;进入编辑模式后,按Esc键则返回指令模式;命令模式只能由指令模式进入,命令模式下执行命令后,便自动返回指令模式。

    1、指令模式:此时是不可编辑的,即此时只有按指令键,vi才有反应,否则,vi是不会有反应的。所以此模式下是不能编辑文件的。

    a -- (指输入a,下同)进入编辑模式,在光标当前位置的后面进行输入 (注:中间的"--"是分隔栏,不是命令的一部分,下同)

    i -- 进入编辑模式,在光标当前位置的前面进行输入

    o -- (小写字母o)进入编辑模式,在光标当前行下面新插入一行,并将光标定位到新行的最前面

    0 -- (数字0)仍然是指令模式,定位光标到当前行的最前面

    $ -- (shift+4)仍然是指令模式,定位光标到当前行的最后面

    j -- 仍然是指令模式,光标向下移动

    k -- 仍然是指令模式,光标向上移动

    h -- 仍然是指令模式,光标向左移动

    l -- 仍然是指令模式,光标向右移动

    G -- 仍然是指令模式,光标移动到文件的最后一行

    nG -- (n是行数)仍然是指令模式,光标移动到文件的第n行

    % -- 仍然是指令模式,如果光标当前位置的字符为大中小括号的一部分,则会自动定位到括号的另一部分,此命令用于代码的定位比较容易

    x -- 仍然是指令模式,将光标当前位置的字符删除

    ndd -- (n为行数)仍然是指令模式,将从光标当前行开始向后计算共n行,一起cut(剪切)。若n为1,则可不需输入,只需dd即可。

    nyy -- (n为行数)仍然是指令模式,将从光标当前行开始向后计算共n行,一起copy(复制)。若n为1,则可不需输入,只需yy即可。

    p -- 仍然是指令模式,粘贴内容到光标所在行的下面

    2、编辑模式:

    即为输入模式,就和运行windows平台的记事本一样。键入什么,则输入什么。

    3、命令模式:

    在指令模式,键入:(冒号)则进入命令模式,光标也会自动定位到vi程序的最下面一行,然后在:(冒号)后面相关命令,然后"回车"即可。命令执行后,会自动返回指令模式。

    :x -- 保存并退出

    :wq -- 同上

    :q! -- 不保存,然后退出

    :n -- (n为行数)光标跳转到第n行

    :1,$s/aa/bb/g -- 从第1行到文件的最后一行(整个文件),将aa替换为bb,不提示且全部替换

    :1,$s/aa/bb/gc -- 同上,只是每发现一个aa,则会提示是否替换

    :set nu -- 设置显示行号

    :set nonu -- 设置不显示行号

    :set ts=n -- (n为数字)设置Table显示为n个字符的宽度,只是显示,而不是替换

    /xxx --(xxx为查找的内容)向下查找(不需要冒号)

    ?xxx --(xxx为查找的内容)向上查找(不需要冒号)

    # --(shift+3)向上查找光标当前所在位置的单词(不需要冒号)

    ' --(引号键)在当前行和上一次查找结果前切换,可多次使用(不需要冒号)

  • linux常用命令(转)

    sll101010 发布于 2009-05-23 16:44:40

    1,目录和文件
    ls  -a -l :查看目录内容,查看文件权限
    cd:更改目录
    mkdir:创建目录
    rmdir:删除空目录
    rm -r -f:删除空,非空 目录,删除文件(rm -rf *\.cn 删除以.cn结尾的文件)
    cp -r :拷贝文件
    mv:移动文件,改名
    ln -s 创建链接(快捷方式)(创建软连接)
    file 查看文件类型
    touch 建立空文件

    2,文件查看编辑
    查看:
    cat
    less
    more  文件分页查看
    tail -f 从尾部查看文件,-f不断读取文件
    head  从头部查看文件
    wc 统计文本文件行数(-l)或者字数(-c)

    编辑:
    vi
    进入编辑模式
    i I
    a A
    o O
    命令
    yy 复制
    p  粘贴
    x  删除
    dd 删除行
    D 删除当前到末尾
    :%s/查找串/替换的串/g
    :w  保存、
    :wq 保存退出
    :x
    :u 撤销
    :行号
    :set nu
    :set nonu
    /搜索串

    3系统管理相关
    用户相关
    useradd  增加用户 增加完之后不能用,必须用(passwd  用户名)为新增用户改密码 (passwd 用户名 为该用户加密码)
    userdel   删除用户
    groupadd  增加组
    groupdel  删除组
    passwd  改密码
    whoami  登录的用户名
    last   上次登录过的用户
    who  谁登录在线
    chmod 改变文件或者目录权限
    chown 改变文件或者目录所有者

    系统资源
    ps -aux  显示所有运行的进程,进程资源占用情况 带方括号[]的是系统进程,不用管 q 退出 平均负载 如果有2个CPU,15分钟的负载最好不要超过2,最好在cpu的75%以下 buffer相当于cache的索引 按shift+>(或<)排序
    kill -9 进程id  杀死一个进程
    killall -9 进程名
    top   查看内存,cpu利用率,进程资源占用情况,系统负载
    w  系统负载
    free 系统内存情况
    netstat -anl 所有的系统连接 (netstat -anl|wc -l 统计行数)
    netstat -tnl 系统打开的tcp端口
    netstat -unl 系统打开的udp端口
    df -h -i 显示系统磁盘空间使用量,率和磁盘i 节点使用量,率
    du -sh . 当前目录占用空间大小
    fdisk -l 系统磁盘分区数目
    mkfs 格式化文件系统

     

  • 最近和微软一哥们聊微软的测试,很有感触,记下来,和大家共同分享。(此文为转载)

    ljonathan 发布于 2009-05-21 01:37:50

    (此文为转载,出处查不到了)

    全文如下:

    开头语:

    作测试很久了,一直为一些问题所困扰,也一直对微软有一种顶礼膜拜的向往,终于有一天,近距离的接触了微软的测试,感觉不是以前想象中那么遥不可及,却又难以企及。于是把个人觉得微软值得借鉴的地方整理了一下,希望能对大家有所帮助。

     

    1.  测试流程

    首先说说测试流程,微软的测试流程也没什么新的东西,和大多数的测试流程一样。

    大致是先进行测试准备,然后是Testcase的编写,然后是白盒测试(不一定每个项目都有),然后是功能测试阶段,然后是验收测试,最终release

    如果看流程的话,和一般公司大同小异,没什么新花样。但是我觉得值得借鉴的是两点。

    第一,   微软的流程执行的非常认真。

    这点非常值得提倡,我们都知道,测试的最终质量决定于测试流程和测试人员素质,要想测试质量有保证,要么是流程很完善,要么你流程不行,但是个人能力超强。如果有一个很好的流程,就算执行的人稍微差点,最终的质量也不会差到哪里去。所以流程是很重要的。

    但是,看国内的公司欠缺的就是这个,要么是没有流程,要么流程是个花架子,没认真执行过。我想微软的测试人都是超级牛人,但是人家还是老老实实的忠实按照流程来走,我觉得这点非常好。(在IBM 也是这样,笔者以前在IBM作项目的时候,发现他们的文档写的特认真,流程特认真),所以说忠实的执行一个好的流程是成功的一大半。

    第二,   在整个流程中,微软非常强调测试尽早介入。微软在这方面是一致提倡的,按照我们国内IT业的恶习,一般都是软件主体差不多成型了,拉几个测试人员过来点点,其实这是非常不好的。微软的测试人员在项目一开始就和开发人员同步介入,在需求阶段就开始介入,进行需求评审。在开发人员开始编码的时候,测试人员就开始编写Test case,并开发一些测试工具,或者写一些配套的测试代码(不要奇怪,微软的测试人员都能写很好的代码)。微软的理念就是:预防bug比解决bug好,所以非常提倡测试尽早介入,把一部分bug消灭在需求阶段。

    2.  自动化流程

    说到自动化,大家可能以为我是说微软的自动化测试工具多牛,其实微软内部用到的自动化测试工具倒是不多,就算有也都是内部开发的,非常实用的,他们不会去用MI的工具。

            说微软的自动化程度高,主要是体现在流程方面,譬如说整个自动

        构建流程,在开发人       员代码check in之后,系统自动发邮件,邮

        件内容就是一个change list,包括代码更新list以及一个编译者添加的comment,其内容是该版本功能的变化或者修改掉的bug ID。整个测试过程中能用自动化的地方都尽可能采用自动化,尽可能减少人为失误,并且可

        以使人和机器并行工作。个人觉得,这点很值得我们国内的测试公司借鉴,能自动化的流程都自动化,减少一些不必要的沟通。

     

    3.  质量控制机制

    说到质量控制是个大问题,需要整个团队和流程提高素质。那么微软的质量控制可以借鉴的是什么呢?是他们的机制。在微软的测试流程当中,在开发的早期,项目中所有的问题都是Dev leaderPM商量说了算(当然也要参考需求方的意见),但是到后期,具体就是功能测试之后,项目的主动权都在测试这边,某个bug的要不要解决,或者项目进度控制都是测试leader说了算。这和国内的大多数软件公司是不一样的,在微软,测试人员要对最终的软件质量负责任,但是也有相应的权利来约束开发人员。当然,他们也肯定有一些bug是产生争议的,这个时候的仲裁机制就是PM,这个不是我们传统的PMProject manager),而是一种具有微软特色的PM(全称是Program manager)。这样,测试人员在对一些争议bug的处理上有相当的话语权。

     

    4.  测试用例及管理

    微软的测试用例倒没什么特别的,不过看过他们用例之后,还是觉得写的详细,认真,但是又不冗长拖沓,这个需要很高深的水平。另外,微软的测试用例管理用的是微软自己开发的用例管理工具。

    另外值得说明的是,微软的每个用例都进行了分级,并且功能所在的模块都标的很清楚。

     

    5.  效率

    在效率方面,微软的测试效率非常高!高的让人惊叹,我问一个在微软工作的哥们,“你们那边测试的最大特点是什么”,他说“最大特点是快!”,就是效率很高,具体就是在测试后期过程中测试和开发之间的反馈非常快,开发修改一定量的bug,提交一个新的版本。测试人员往往能在很快的时间内把测试结果反馈出来,一般是在1天之内就能把用例快速run一遍,这样就能减少某些后期才发现bug导致的项目delay。在国内很多项目的通病是,开发解决问题带进一个新问题,测试人员整个遍历一遍用例之后才能发现,这样来回反复就消耗了大量的时间。

    但微软是如何才能实现快速反馈呢?

    第一,   测试人员对程序的了解,微软的测试人员对程序内部结构都非常熟悉,修改某一个地方,可能引起什么问题,哪些用例需要重新测试,测试人员非常清楚,能快速的执行最可能出错的地方。如果某些模块不熟悉,那么他们会和开发人员在一起沟通这次修改可能引起的问题。

    第二,   工具!还是工具,在微软的测试中,测试人员用各种工具帮助测试,提高测试效率是占到很大的比重。

    第三,   时间意识。微软的测试人员有强烈的时间意识。

     

    6.  测试工具

    测试工具能很大程度上提高测试效率,这个作为测试人员都很清楚。当然测试工具在微软的测试中也应用非常广泛,但是请注意,微软并不是像我们国内的公司一样使用的都是LRQTP这类的录制回放工具,反而这种工具倒是用的不多,就跟微软不屑CMM一样,可能是不想屈尊自己IT老大的身份吧。

    但是微软的测试工具最大的特点是实用。他们用的测试工具都是确实能提高效率,确实能办事情的工具,都不是类似WRQTP的很大很系统的工具,而是比较小的,很灵活,实用的小工具(譬如:FiddlerDriphttpwatchIE DevToolBarPaintNotNetprocexp etc.)。甚至有一些测试工具是测试人员在开发人员协助下根据项目需要临时开发的,不过大多数工具都是微软内部已经共享出来的,在微软内部各种各样的小工具特别多。

    总体给我的感觉是,不是为了用测试工具而用,而是根据实际的需要,确实能提高效率而用到,在用的过程中确实也很大的提高了效率。

     

    7.  测试人员的专业素质

    微软测试给我印象最深刻的还有他们测试人员的专业水准,在测试过程中,测试人员在一些技术上并不逊色于开发人员,在一些bug的处理上,能提出很多合理的很有建设性的建议。

     

    8.  微软的白盒测试

    微软的白盒测试怎么执行呢?让我略微有点吃惊的是,微软的一半测试人员基本不做白盒测试,除非有些不能做黑盒的模块,另外也不是所有的产品都作白盒测试。

    微软的白盒测试一般还是由专门的白盒测试人员来做,但是开发人员要对测试人员的白盒测试代码进行Review,另外微软对开发人员的代码,效率也都有一套详细的考核机制,所以开发人员对自己的代码也是非常负责任的,都进行很认真的进行测试。

     

    9.  意识(时间,质量)

    另外微软的测试还有很好的一点就是意识,时间和质量的意识都是非常强。在控制时间成本上,意识非常强,这点非常值得我们国内同仁学习,另外,风险管理的机制和意识都是非常好。在微软,项目组的每个成员都被明确告知,如果这个项目每delay一天,就会损失多少个million的美元,所以整个项目组都有比较好的时间意识。

    另外,在微软,项目组人员的质量意识都是比较强的。怎么样更好服务用户,让用户体验更好,怎么样更好的改进,这种意识比较强。

     

    10. 微软的培训

    在微软内部,员工外训的机会比较少,大多都是内部互训,各人培训自己的强项,有比较好的互相分享的习惯。另外微软的内部有非常丰富的各种培训文档。以后我会上传上去和大家分享。

     

    11 测试数据记录

    微软的测试数据记录是非常全的,也都是系统自动的,每天都是由系统自动统计当天的bug情况,然后发送一个report到每个项目组成员的邮箱里。最后到测试总结的时候,这些测试数据将变得非常有用。

    编后感:在深入了解微软的测试之前,对微软这个IT业界巨无霸的测试感觉是顶礼膜拜,高不可攀,总觉得可能很神秘,用很牛的技术或者很高深的手段。深入了解之后,发现微软的测试也是和我们做一样的事情,只不过人家做的更认真,更细,更实用,更有效率。再回过头来看时,微软的测试给我留下印象最多的是,流程,效率,意识,工具,素质!也就是这几项,成为我们国内IT企业亟需跨越的。

  • 盘点国内外企业软件测试工程师待遇

    wu_xiaoxiang 发布于 2009-05-21 11:13:11

    中华英才网近期发布了最新一期的IT职场人气排行榜,最热门的前三名岗位是:

    软件测试工程师、高级程序员、产品项目经理的高级职位;作为软件开发流程中

    的重要一环,软件测试在2006年浮出水面,成为IT职场的最新热门岗位。
        据统计,2006年北京在国展举办的几次招聘会,合计曾有180多家软件企业高

    薪招聘软件测试人员,仅有7家收到的简历能够达到招聘岗位数的50%,但符合企

    业要求者也不足30%。
        笔者从一位测试行业资深人士了解到,随着测试工作量的增加,如果要招到

    合适的软测人员,很多测试部门经理不得不把大部分时间和精力用在人员招聘上

    。如果说是企业的要求苛刻,倒不如说应聘者对于软测的知识掌握还不成体系,

    真正合格的测试人员太少;而目前我国还没有软件测试的大专和本科专业,在软

    件测试越来越重要的今天,更加凸显出软测人才缺乏的瓶颈;也因此软件测试工

    程师的薪酬一直“高烧不退”。
        软测工程师,薪情差异大
        并非软件测试工程师清一色的都是高薪,从业时间不同,技术水平不同,薪

    酬待遇也不尽相同。
        测试工程师一般会分为以下几个等级:初级测试工程师、中级测试工程师和

    高级测试工程师。不同的级别的测试工程师薪资差异很大。
      ■ 高级测试工程师:
        高级测试工程师年薪约8-10万元左右。他们不但需要掌握测试与开发技术,

    而且对所测试软件对口的行业非常了解,能够对测试方案可能出现的问题能够进

    行分析和评估。
      ■ 中级测试工程师:
        中级测试工程师的年薪约在5-6万元左右。他们要能够编写测试方案,测试文

    档、与项目组一起制定测试阶段的工作计划。能够在项目中合理利用测试工具来

    完成测试任务。
        ■ 初级测试工程师:
        初级测试工程师的年薪约在3-4万元左右。他们的工作通常是按照测试方案和

    流程对产品进行功能测试,检查产品是否有缺陷。
        以3~5年左右的从业工作经验看,各地的软测工程师薪资情况也不尽相同:
      深圳地区的平均年薪是全国各城市最高的,超出7万元,其中外商独资欧美企

    业的年薪为7.8万元;
      北京地区该职位的平均年薪逾5.8万元;其中外商独资企业的年薪为全国之最

    ,将近8.5万元,而其余各类型企业的年薪都在5~6万元左右;
      广州地区该职位的平均年薪约为4.5万元;其中外商独资欧美企业的年薪能达

    到7万元;
    上海地区软件测试工程师的平均年薪为6.3万元,欧美独资和欧美合资的薪资不相

    上下,分别为7.9万和7.7万元; 
        总体来看,软件测试作为软件质量控制中的重要一环,在大型的软件开发企

    业中,软测工程师基本处于“双高”地位,即地位高、待遇高。同时,软件测试

    的人才需求缺口超过20万人。可以说他们的职业前景非常广阔,而人才的紧缺也

    促使软件测试工程师的薪资逐渐走高,从近期的企业人才需求和薪金水平来看,

    软件测试工程师的年工资还有逐年上升的明显趋势。
        软件测试工程师的工作内容
        “假如存在没有任何错误的程序,那么世界也会不复存在。”
        因错误而存在,因修正错误而存在,这就是软件测试工程师的存在之道。虽

    然测试不是解决错误的根本举措,但却是必须的手段。
        软件测试工程师(Software Testing Engineer)的主要工作职责是,理解产

    品的功能要求,并对其进行测试,检查软件有没有错误(Bug),决定软件是否具

    有稳定性(Robustness),写出相应的测试规范和测试案例。简而言之,软件测

    试工程师在一家软件企业中担当的是“质量管理”角色,及时纠错及时更正,确

    保产品的正常运作。据有关调查数据表明,目前在国内许多软件企业,测试人员

    和开发人员之比在1:7和1:5之间,与国外软件业1:1的比例还相去甚远。
      软件测试工程师主要职责为:
    1、 负责项目/产品的测试工作,分析产品需求,建立测试环境和计划,保证产品

    质量以及测试工作的顺利进行;

    2、 按照软件工程规范和项目管理流程,实施、管理和知道软件开发不同阶段的

    各种测试,并提交测试报告。测试的计划安排包括人员安排、进度、使用的软硬

    件环境、测试的流程等;
    3、 提交测试报告,并撰写用户说明书;
    4、 参与软件测试技术和规范的改进和制定。
        要成为一名合格的软测工程师,一般需要至少专科学历,一到两年测试工作

    经验。要熟悉软件的测试技术、方法、流程、测试文档,若想进一步提升,还要

    熟悉自动化测试的流程、管理及深层开发(包括测试框架等);了解若干主流测

    试工具,如功能测试工具winrunner、quicktestpro,性能测试工具LoadRunner

    配置管理工具TestDirecter, Visiual Source Safe等;熟悉一些主流的软件工程

    方法论和思想,如RUP、CMM、CMMI、XP、PSP、TSP;了解软件工程,软件生命周

    期模型基础,了解软件配置管理;能够根据不同企业的产品特点,要求了解相应

    的开发测试方法。对于资深的软件测试人员,有些企业还要求其本身有自主开发

    测试工具的能力。
        此外,由于需要与开发人员及时沟通,因此作为一个出色的软件测试工程师

    ,还需要有良好的沟通技巧以及优秀的言语表达能力,具备良好的团队合作精神


        软件测试工程师是个没有性别歧视的职业
        软件测试工程师不同于软件工程师,软件工程师多为男性,因为软件开发工

    作需要很强的逻辑推理能力,而软件测试工程师不需要天天去思维创造,工作重

    点是在注重经验的积累上面,同时,软件测试工程师要查找软件的缺陷需要具备

    的素质与女性所有的细心,耐心,安静,敏感等各个方面很吻合。这是其一。   

            其二, 软件测试工程师需要调节软件开发人员、项目经理和自身的关系

    ,因为是在找软件编程人员的漏洞,所以在沟通方面女性具有独特的优势
        目前在方正担任软件测试经理的贺先生在接受采访时,对上述观点表示了认

    同。贺先生介绍说,软件开发多运用正向思维的方式,而软件测试工作则要根据

    原始需求、验证编码,在思维上更多使用逆向方式,根据已知的方向进行发挥,

    从中找出并预见到软件开发中的不完善之处。采访之余,贺先生还特意提到了他

    从软件开发转为软件测试的“个人原因”。在做软件开发工作时,贺先生周边基

    本上是清一色的男性,工作氛围更显得“严峻”。转到软件测试岗位后,均衡的

    性别比例使得工作压力也缓释了不少,“男女搭配,工作不累”,贺先生幽默的

    结束语道出了软件测试岗位的特色。
        软件测试工程师,越老越值钱
        在很多开发工程师都担心“35岁之后是否还写的动程序”时,软件测试工程

    师确相反,测试人员的工作生命周期长,不断的技术经验和相关行业背景知识积

    累使得他们“越老越值钱”。这是因为软件测试更多关注的是经验与方法的积累

    ,开发语言变化对其工作的影响远小于对开发人员的影响。

  • LoadRunner学习---脚本编写(4)(比较重要)(转载)

    ljonathan 发布于 2009-05-21 22:49:26

     

    转自:http://www.51testing.com/?uid-34866-action-viewspace-itemid-70224

    今天接着来翻译http://www.wilsonmar.com/中关于LoadRunner脚本编写部分,下面该翻译脚本编写中一些比较重要的部分了。txHg$^^zv20284851Testing软件测试网l$d3J,k w e:E zb4U

    Web用户Action

    2mjN*{[T$_'t9^202848

    3r3V9X ?i8?202848    在VuGen中,脚本产生的默认模式是基于HTML的--“描述用户的动作的脚本”直接与用户的动作是对应的:

    !Pn$cpi,~1Y7OP._20284851Testing软件测试网B7u,K` Nkqf:d0_

        *web_url是浏览器地址栏的URL.51Testing软件测试网bAuK"r!g ?C${

    )VP X)Q{ U/b r6R202848    *web_link是点击在<ahref= ...>和<a>之间的文本超链接。51Testing软件测试网BP|{ U.D!I6`~ r

    51Testing软件测试网e*`z|P

        *web_image是点击HTML的<imghref= link.51Testing软件测试网2K4RZ6eo_*M

    E.~3dQ+yN202848    *web_submit_form是在前面操作的上下文中的GET或PUT表单上点“提交”--可能前面的操作被VuGen在基于HTML模式下录制下来了。

    iE"We/H/`#I"D20284851Testing软件测试网2x0p2|xH6[s&Sem

        *web_submit_data是在GET或PUT表单上点“提交”,而没有带前面操作的上下文--可能是在基于URL模式下录制,或者是基于HTML模式,并且选择了“A scrīpt containing explicit URLs only”选项。51Testing软件测试网0L;Hw4W(c`!H1] C c

    51Testing软件测试网:KCi$`+B,hk T,a

         不用HTML产生的资源是.gif和.jpg图片。资源属性的列表只能当对这些资源的路直选项设置成“Record within the current scrīpt step”时被插入。这也是默认的设置。51Testing软件测试网k:B P!_j3n.h

    51Testing软件测试网E-S&lVL+H#eO'B!u

          如果你在“Tools > Internet Procotol > Recording”中选择“a scrīpt containing explicit URLs only”,这将会产生URL-based的脚本录制,只使用web_url和web_submit_data函数,将不会使用 web_link 和 web_image函数,或包含在 applets, XML, ActiveX或javascrīpt中的非HTML元素。

    HX4D9` J|cFF202848

    @s CC-A9S202848Idea在进行下一页录制之前(如点击链接或者图标),暂停录制,把该页屏幕的标题拷贝下来粘贴到注释中。录制完成之后,这将会在后面的给事务命名上用到。51Testing软件测试网$W0H5}#A'g ?"`X

    #t,oh t%JG3Z p202848Idea在每一个页面显示之后,暂停录制,把决定是否是期望页的文本拷贝下来,粘贴到注释中。录制完成之后,这将会用到文本验证检查点的脚本编写中。

    D4mp7X&t,f7M6L20284851Testing软件测试网4Md(k zah

         录制中产生的各种信息都保存在RecordingLog.txt文件中,删除它不会对脚本的回放产生影响。

    UZ3pq cL6E'X20284851Testing软件测试网 X'Dm;n s

    额外录制的Action脚本

    'd(xA+s8e8F9T)y1l20284851Testing软件测试网E Y7l%?PDD C

        录制脚本的时候,当浏览器没有安装SSL根证书的时候,会捕获的下面这些代码行。这个信息意思是“这个证书不能被信任证书验证”。51Testing软件测试网$dp%G!x5|cR:y[

    51Testing软件测试网9co*RR Hz3o

       web_url("authrootseq.txt",

    b?8H~.d202848

      "URL=http://www.download.windowsupdate.com/msdownload/update/v3/static/trustedr/en/authrootseq.txt",51Testing软件测试网vpm@3o,\"?L2UBy
      "Resource=1",
      w7kq]{1@ ]4M202848"RecContentType=text/plain",51Testing软件测试网7Ub){RLY
      "Referer=",51Testing软件测试网 ]ODTX] H[O
      LAST);
      y H`'` z7`G)a s8C|L7c202848

    h R7sb'd d K{!Gh202848web_url("authrootstl.cab",51Testing软件测试网 Z9x:sum

      "URL=http://www.download.windowsupdate.com/msdownload/update/v3/static/trustedr/en/authrootstl.cab",
      ^caZ A1DyH8V202848"Resource=1",
      !Z8s(]A^0I(O202848"RecContentType=application/octet-stream",
      4E-o!y.@EO `;C202848"Referer=",51Testing软件测试网'R$a"l X'X(n
      LAST);
       录制脚本的时候,但浏览器遇到Macromedia flash组件的时候,会产生下面的代码行:
      web_url("version_en_win_ax.xml",
        "URL=http://fpdownload.macromedia.com/pub/flashplayer/update/current/xml/version_en_win_ax.xml",
        ^Ah'CXJT}S202848"Resource=0",
        m_ Y `:bs{.pB*^i202848"RecContentType=text/html",51Testing软件测试网(F9m1wIC9i u1x
        "Referer=",
        (qC1Ys5sGM$@ m202848"Snapshot=t8.inf",51Testing软件测试网h-gq jA'l.o
        "Mode=HTML",
        Sh3B@.I D7w eJ1h202848LAST);
              如果你安装有Google Toolbar,即使你没有访问Google,也会录制上发到Google的请求。
        脚本语言规则:
         在LoadRunner中,大小写是敏感的,甚至在被检验的值中。所以上面的脚本会因为大写字母的原因,不会识别“Welcome”的。所以Steve Cheney 建议使用“ic”忽略大小写的文字标志:
         web_reg_find("Text/ic=Welcome",LAST);
         括号里的参数包含了LAST是为了指定最后的一个参数。这样做是很方便的,因为上面的例子漏掉了一个指定期望是“found”还是“notfound”的属性。默认是“found”,所有我经常忽略它。
          另一个文本标志是“/BIN”用来指定是二进制的字符集。例如,查找“Adams”:
        web_reg_find("Text/BIN=\\x00A\\x00d\\x00a\\x00m\\x00s",LAST);
        注意两个反斜杠,一个是转义字符,代表是使用了一个符号。如果错误的只使用一个反斜杠,LR会认为它是一个空的终止。
              下面的例子脚本是在UTF8服务器上支持获得newquoteuid为UTF-16编码。因为LoadRunner中,UTF16编码的“Red”用ASCII是 R\x00e\x00d\x00 这样的,所以需要把它保存到buffer中。
        lr_eval_string_ext("{newquoteuid_temp}",
        +Kcw6E*R3k#{IsE202848strlen("{newquoteuid_temp}") + 2,51Testing软件测试网K ]8GV6G0WI F4JZ
        &Buf, &BufLen, 0, 0, -1);
         对字符数组变量NewBuf使用lr_save_var函数来去掉额外的填充(x00):
        for (i=0; i if (Buf[i]!=0) NewBuf[NewBufLen++]=Buf[i];
        'RV!n&z vvp:]#^202848lr_save_var(NewBuf, NewBufLen-1, 0, "newquoteuid");
         注:lr_save_var 需要四个参数(不需要使用LAST)
         1.param_value 参数值
         2 value_len 参数的长度。
         3 options 参数的选项,一般为0
         4。param_name 参数名称
         LoadRunner 7.8不支持正则表达式,但是有他自己的通配符:
         为了使任何[0-9] 的数字在指定的数字位置,使用/DIG做标志:
         web_reg_save_param("pSer","LB/DIG=Serial XXX-###-ZZZZ","RB=\r\n", LAST );
         有三种使用^做通配符的方法:
         * 忽略大小写,并且允许在指定的字符位置使用任意字符:
          web_reg_find("Text/ALNUMIC=^ercury", LAST);
         * 允许任何小写字符[a-z] 在指定位置:
          web_reg_find("Text/ALNUMLC=^ercury", LAST);
         * 允许任何大写字符[A-Z]在指定的字符位置:
          web_reg_find("Text/ALNUMUC=^ercury", LAST);
         把一个字符串变成大写:strupr()
        错误信息:
         请添加一些其他的错误信息来帮助其他人:

        Could not resolve address of host ... [MsgId: MERR-27798]

        如果网络不能用或者域没有注册的话,显示一个404的DNS错误

        OsK7l Jj;w|'q20284851Testing软件测试网1a#W8[*P Ma.Lw;t4wk

        L$b8W/V4~Vy&e,a202848

        Contents unexpectedly not in cache. [MsgId: MERR-26549]

        +~hyJ3A+f0P202848当一个文件为空时会显示该错误。在空文件中添加空格来满足LoadRunner的错误检查。BTW,因为当创建的iframe没有文件时,IE会产生一个错误,这样就指定了一个空文件。51Testing软件测试网8Eo3c }(ggf!mUP

        51Testing软件测试网N&sW ] HZnO8n

        事务时间脚本编写:51Testing软件测试网Hx9L|-TQO.|

        51Testing软件测试网[@/tXp5p'j ST#|F1{8Z1k

        Idea我更喜欢给一个action命名事务,而不是一个结果页面。51Testing软件测试网-])JT9FzG;X

          lr_start_transaction("00.1 Invoke URL");51Testing软件测试网;F;i5n EPg
          ...
          k%Em-IUx!W{202848lr_end_transaction("00.1 Invoke URL",LR_AUTO);51Testing软件测试网cXD8]"Y"n:xj:X2jI
          ...
          )s.sK:B D _$U&D202848lr_start_transaction("01.2 Top menu");
          !j+Wy:]3D t$^ ~8s202848...51Testing软件测试网}h@/`uN
          lr_end_transaction("01.2 Top menu",LR_AUTO);51Testing软件测试网c,o [@kBC5b
          51Testing软件测试网E&b*[!e(P`c)`
          lr_start_transaction("02.0 Updating");

            kB}2|AKq;U202848lr_start_sub_transaction("02.1 Update menu","02.0 Updating");51Testing软件测试网0@,s m m j
            web_url( ...
            q Rzw?o\u202848lr_end_sub_transaction("02.1 Update menu",LR_AUTO);51Testing软件测试网(J5[Qwp$}
            lr_start_sub_transaction("02.2 Update submit","02.0 Updating");
            ItX \ KQ H202848web_submit_form( ...51Testing软件测试网Vo~t R w!_
            lr_end_sub_transaction("02.2 Update submit",LR_AUTO);51Testing软件测试网pR:e)py
            lr_start_sub_transaction("02.3 Update OK","02.0 Updating");
            !Yq&PH@#~+?B ]202848web_url( ...51Testing软件测试网'O x2byv
            lr_end_sub_transaction("02.3 Update OK",LR_AUTO);

          X W6t0y3Q!RE4_,U20284851Testing软件测试网Q)WRy N}p#l
          lr_end_transaction("02.0 Updating",LR_AUTO);
        51Testing软件测试网i0?q0R W T&zJ(_

        Idea我喜欢在一个层次结构中使用0填充的事务名称,这样来确保控制器能够正确的给事务排序。51Testing软件测试网OsbsN$b

        Idea我对不同类型的action上的事务名称上加不同的关键字
      • ContactLink= Click "Contact" link on Menu
      • ContactIcon= Click "Contact" Icon
      • Regis.Sub= Page Submit
      • OK= Pop-up dismiss with OK

      51Testing软件测试网 pb(m'?9F!Pz/Ai

          事务名可以是变量,但是它只能被VuGen作为字符串来编译,不能在控制器的接口中显示。无论如何,他们会显示在分析结果文件中。51Testing软件测试网 ~*t X5P0q U5j{3L7]

      51Testing软件测试网U_6A&b zq#Bb\

           对于web脚本,LR自动创建和决定事务的的持续时间,但是C语言脚本可以使用这些函数:

      #wF&o'lz202848

      $cY+Z"[zBr'GG*`aay202848     使用lr_start_transaction_instance函数来显式获得指定事务实例的句柄,事务名称在函数lr_user_data_point_instance或lr_user_data_point_instance_ex中使用。

      p0}HL+Tn:U20284851Testing软件测试网j FO1P @9M0F/V

            使用 lr_start_sub_transaction在一个事务中来操作思考时间和消耗的时间。51Testing软件测试网*b/Lc1ul ~,` N

      51Testing软件测试网.m/f,{YaL2r%]G

            好了,脚本编写部分基本已经翻译了一半了,该睡觉了,下面会接着翻译检查点,操作字符串,从流中获得数据,参数化,如何使用文件,关联,集合点等,内容还是很多的。哈哈

      1mD^8M8Q|202848

      6G/|&Y}ITFw202848 

      KdI+`)KL1G,xZ202848

    • IP、子网掩码、网络号之间的关系、区分和运算

      wu_xiaoxiang 发布于 2009-05-19 17:10:16

      此贴中所说到的IP都以是IPV4为例。

      IP地址总共是32位二进制数表示,每8位为一节,总共4节。日常使用中每节用一个十进制表示(0-255)。每个IP地址都是由网络号+主机号组成,前面N位表示网络号,后面32-N位表示主机号。到底前面几位表示网络号就是由子网掩码来区分,在子网掩码中用1和0来分别网络号位和主机号位,其中是1的表示是网络位,0表示主机位,前面说的IP中前面的N位表示网络号,后面的32-N位才是主机号,所以子网掩码总是前面一段全是1,后面一段全是0。我们的IP范围就是主机号范围。所有主机号中的最后一个主机号为广播地址。

      比如一个IP地址:192.168.0.1/24,这是我们常见的一个C类地址,用二进制表示就是 IP:11000000 10101000 00000000 00000001 子:11111111 11111111 11111111 00000000

      这就是说这个IP中,前24位表示网络号,后面8位表示主机号。也就是说我们IP取值范围就是最后的8位从0000000-11111111之间,用十进制表示也就是0-255之间,在地址中0不能作为IP地址使用,他是网络号的专用,也就是说我们的取值范围是在1-255之间,其中1是网关地址(实际中我们组建局域网的时候不一定用1作网关这是另一回事),255是广播地址,也就是说实际能使用的只有253个IP,即192.168.0.2-192.168.0.254。

      那什么是网络号呢?说得直接一点就是这个局域网在网络上的IP。我们知道每一台计算机在网络上都有一个IP地址,这个IP地址就是这台计算机在网络上的一个编号,那么网络号也就是这个局域网在互联网上的IP地址编号。网络号的计算方法是把IP地址与子网掩码作“与”运算,所谓的与运算,就相当于我们并时所说的乘运算,当两个同为1时其结果为1,如果其中有一个是0则结果是0。在上面的例子中前面的24位是网络号那么这个局域网在网络中的编号就是192.168.0.0,现在知道为什么0始终不能用为IP地址了吧。如果两台机的网络号不一样,表示这两台机不在同一个局域网中。比如有如下两个IP:192.168.0.115/24,192.168.5.115/24,用二进制表示就是:

      IP1: 11000000 10101000 00000000 01110011 子网: 11111111 11111111 11111111 00000000 网络号: 11000000 10101000 00000000 00000000 十进制表示网络号:192.168.0.0

      IP2: 11000000 10101000 00000101 01110011 子网: 11111111 11111111 11111111 00000000 网络号: 11000000 10101000 00000001 00000000 十进制表示网络号:192.168.5.0

      两个IP的网络号不一样,表示这两个IP不在同一个局域网中。

      又比如我网吧从电信公司分到一组IP:89.153.43.225/29,那么换成二进制就是

      IP:01011001 10011001 00101011 11100001 子:11111111 11111111 11111111 11111000

      可以清楚的看出这组IP在网络上的网络号是前面的29位,用十进制表示就是89.153.43.224,这组IP的主机号就是最后的三位,我们说过主机号范围就是IP范围。我网吧从电信公司分得的IP范围用二进制表示就是:

      IP1:01011001 10011001 00101011 11100000 IP2:01011001 10011001 00101011 11100001 IP3:01011001 10011001 00101011 11100010 IP4:01011001 10011001 00101011 11100011 IP5:01011001 10011001 00101011 11100100 IP6:01011001 10011001 00101011 11100101 IP7:01011001 10011001 00101011 11100110 IP8:01011001 10011001 00101011 11100111

      我们说过0只能用来表示网络号,不能用于IP,所以上面的8个IP中,只有IP2-IP8是合法的,用十进制表示就是89.153.43.225-231,其中89.153.43.225是网关,89.153.43.231是广播地址,实际可用IP是89.153.43.226-230,因为这一组IP的网络号同为89.153.43.224,所以在互联上这一组IP属于同一个局域网。

      比如有一个网吧有300台机,那么从上面的公式中可以计算出至少要300+2=302个IP,也就是主机号从1-302,用二进制表示就是: 000000001 000000010 000000011 ..... 100101110

      也就是说主机号至少要占用9位,那么网络号就只有23位即:二进制:11111111 11111111 11111110 00000000 十进制:255 255 254 0

      那么这个局域网的子网掩码是255.255.254.0,主机号的范围是1-511,其中主机号为1的是网关,主机号为511的是广播地址,这个局域网最多可以拥有509台电脑。假如网络号为192.168.0.0,刚IP范围为:192.168.0.1/23-192.168.1.255/23,其中192.168.0.1是网关(实际我们组网中不一定用这个IP作网关),192.168.1.255是广播地址。

      知道了IP地址、子网掩码、网关、广播地址之间的关系就可以准确划分子网。

      子网掩码计算一般采用2的N次幂的方法。2^(N-1)<(计算机总台数+2)≤2^N,这里的N就是主机号位数。 2^0=1 2^1=2 2^2=4 2^3=8 ...... 2^9=512 2^10=1024 2^11=2048 当初我们上学的时候要背到2的20次方,那个苦啊.

      比如上面的例子中300台电脑,2^8<(300+2)≤2^9,所以主机号应该是9位,那么子网掩码就应该是32-9=23位,即255.255.255.254.0。

    • VBS实用命令

      xjr20042 发布于 2009-05-17 10:38:06

      创建文件系统对象,用以处理驱动器、文件夹和文件
      Set fso = Wscript.CreateObject("Scripting.FileSystemObject") '创建系统Shell对象,用以运行程序等等
      Set WshShell = Wscript.CreateObject("Wscript.Shell") '如果找到文件“D:\\刀剑Online\\alreadyexist.txt”则
      if fso.fileexists("D:\\刀剑Online\\alreadyexist.txt") then'运行“D:\\刀剑Online\\刀剑Online.exe”
      WshShell.Run("D:\\刀剑Online\\刀剑Online.exe") else'否则,如果找到“\\\\gengxin\\update\\dj.exe”则
      if fso.fileexists("\\\\gengxin\\update\\dj.exe") then    '运行“\\\\gengxin\\update\\dj.exe”
          WshShell.Run("\\\\gengxin\\update\\dj.exe") else    '否则运行“D:\\刀剑Online\\刀剑Online.exe”
         WshShell.Run("D:\\刀剑Online\\刀剑Online.exe") '根据条件执行语句结束
      end if
      end if
      --------------------------------------------------------------------------------

      '写入注册表后再运行指定程序
      dim Wsh
      Set Wsh = WScript.CreateObject("WScript.Shell")
      Wsh.RegWrite "HKCU\\SOFTWARE\\AUDITION\\AUTOSTART",0,"REG_DWORD"
      Wsh.RegWrite "HKCU\\SOFTWARE\\AUDITION\\PATH","G:\\网络游戏\\劲舞团1.5","REG_SZ"
      Wsh.RegWrite "HKCU\\SOFTWARE\\AUDITION\\VERSION",1010,"REG_DWORD"
      Wsh.run "patcher.exe"

      --------------------------------------------------------------------------------

      '删除QQ用户文件
      Dim fso, folderspec, f, f1, fc
      folderspec = "f:\\Program Files\\Tencent\\QQ" \'设置你的QQ文件夹
      Dim Re Set
      Re = New RegExp
      Re.Pattern = "^\\d{4,13}$"
      Set fso = CreateObject("scripting.FileSystemObject")
      Set f = fso.GetFolder(folderspec)
      Set fc = f.SubFolders
      For Each f1 in fc
      If Re.Test(f1.name) Then
          On Error Resume Next
          f1.Delete(true) On Error GoTo 0
      End If
      Next
      --------------------------------------------------------------------------------
      '隔5分钟运行一次批处理程序Dim Wsh
      Set Wsh = WScript.CreateObject("WScript.Shell")
      Do
      Wsh.Run "d:\\aaa.bat" '你要执行的批处理
      WScript.Sleep(300000)
      Loop
      --------------------------------------------------------------------------------
      将域用户或租添加到本地组
      Set bjGroup = GetObject(WinNT://./Administrators)
      Set bjUser = GetObject(WinNT://testnet/Engineers)
      objGroup.Add(objUser.ADsPath)
      --------------------------------------------------------------------------------
      修改本地管理员密码
      Set bjcnlar = GetObject(WinNT://./administrator, user)
      objcnla.SetPassword P@ssW0rd
      objcnla.SetInfo
      --------------------------------------------------------------------------------
      弹出 YES or NO 的对话框,不同的选择执行不同的代码
      intAnswer = Msgbox("是否", vbYesNo, Delete Files)
      If intAnswer = vbYes Then
      Msgbox You answered yes.
      Else Msgbox You answered no.
      End If
      --------------------------------------------------------------------------------
      '弹出 YES or NO 的对话框,不同的选择执行不同的代码
      intAnswer = Msgbox ("是否真的要删除文件?", vbYesNo, "提示:")
      If intAnswer = vbYes Then
      Msgbox "您选择的是Y"
      Else
      Msgbox "您选择的是N"
      End If

      --------------------------------------------------------------------------------
      运行CMD命令行命令
      set bshell=wscript.createobject(wscript.shell)
      obshell.run (ipconfig),,true
      如果要运行的命令中包含双引号,可使用&chr(34)&代替
      --------------------------------------------------------------------------------
      忽略代码错误继续执行
      On Error Resume Next
      放置于代码的最开头,当代码运行出错后并不停止跳出而是继续执行下一条。适当应用会很有效果。
      --------------------------------------------------------------------------------
      注册表的修改,读取,删除,创建Set wso = CreateObject(WScript.Shell) '声明
      wso.RegWrite %Path% '创建子键
      wso.RegWrite %Path%,%Value% '修改默认键值
      wso.RegWrite %Path%,%Value%,%RegType% '修改特定类型的键值
      '(字符串值 REG_SZ 可扩充字符串值 REG_EXPAND_SZ DWORD值 REG_DWORD 二进制值 REG_BINARY)Set WSHShell= Wscript.CreateObject(Wscript.Shell)
      WSHShell.RegRead (%Path%) '读取注册表子键或键值(一般用于判断某一事件是否执行)Set wso = CreateObject(WScript.Shell)
      wso.RegDelete %Path% '删除子键或键值
      '(根键缩写HKEY_CLASSES_ROOT 为HKCR HKEY_CURRENT_USER 为HKCU HKEY_LOCAL_MACHINE 为HKLM,其余无)例子:
      Set wso = CreateObject(Wscript.Shell)
      wso.RegWrite HKLM\\SOFTWARE\\Microsft\\Windows NT\\#1
      wso.RegWrite HKLM\\SOFTWARE\\Microsft\\Windows NT\\#1,0
      wso.RegWrite HKLM\\SOFTWARE\\Microsft\\Windows NT\\#1\\#2,0,REG_BINARY
      wso.RegDelete HKLM\\SOFTWARE\\Microsft\\Windows NT\\#1
      Wscript.quit
      --------------------------------------------------------------------------------
      '文件的复制,删除,创建,简单的写入
      Set fso = Wscript.CreateObject(Scripting.FileSystemObject) ‘声明
      Set f = fso.CreateTextFile(%PATH%) '创建文件,其中f可任意,包含缩略名
      f.WriteLine(VBS) '写入文件一行内容,该命令功能太简单,目前看来只能用于TXT文件
      f.Close '关闭打开的文件
      set c=fso.getfile(%path%) ’拷贝某文件
      c.copy(%PATH2%) \'拷贝文件到指定地点
      fso.deletefile(%PATH%) \'删除文件例子:
      Set fso = Wscript.CreateObject(Scripting.FileSystemObject)
      Set f=fso.CreateTextFile("C:\\Sample.txt")
      f.WriteLine(VBS)
      f.close
      set e=fso.getfile(C:\\Sample.txt)
      e.copy(D:\\Sample.txt)
      fso.deletefile(C:\\Sample.txt)
      Wscript.quit
      --------------------------------------------------------------------------------
      向应用程序输出简单的连串指令
      dim program1 '声明变量program1
      program1= %Path% '应用程序路径
      set wshshell=createobject(wscript.shell) '声明引用函数
      set exec=wshshell.exec(program1) '运行程序
      wscript.sleep 2000 '延迟2000毫秒
      wshshell.appactivate %WindowsName% '指定要激活的程序窗口标题
      wshshell.sendkeys +{%KeyBoardName%} '第一次输出键盘按键指令前要加+
      wshshell.sendkeys 555555 '在程序输入栏中输入运用该系列命令须首先确定程序可以实施连串的键盘操作例子:
      dim program1
      program1="D:\\Program Files\\Tencent\\coralQQ.exe"
      set wshshell=CreateObject(wscript.shell)
      set exec=wshshell.exec(program1)
      wscript.sleep 2000
      wshshell.appactivate "QQ登录"
      wshshell.sendkeys +{TAB}
      wshshell.sendkeys 250481892
      wscript.sleep 2000
      wshshell.sendkeys {TAB}
      wshshell.sendkeys ****************
      wscript.sleep 2000
      wshshell.sendkeys {ENTER}
      Wscript.quit
      --------------------------------------------------------------------------------
      文件夹的简单操作
      Set fso = Wscript.CreateObject(Scripting.FileSystemObject) ‘声明
      Set f = fso.CreateFolder(%PATH%) '创建文件夹
      Set e = getFolder(%PATH%) '类似于“绑定目标”
      e.copy(%PATH2%) '复制文件夹
      fso.deletefolder(%PATH%) '删除文件夹例子:
      Set fso = Wscript.CreateObject(Scripting.FileSystemObject)
      Set f = fso.CreateObject("C:\\sample")
      f.copy("D:\\sample")
      fso.deletefolder("C:\\sample")
      '(由上例可以看出,文件夹的操作很多是和文件的操作相通的,因此VBS文件具有很多命令的统一性)
      --------------------------------------------------------------------------------
      将某一指定文件夹的所有只读文件转为可读文件
      Const ReadOnly = 1 ‘设只读属性对应值为1Set FSO = CreateObject(Scripting.FileSystemObject) \'声明
      Set Folder = FSO.GetFolder(%PATH%) ’绑定文件夹
      Set colFiles = Folder.Files ‘文件夹所有文件For Each objFile in colFiles ’下列语句应用于文件夹所有文件
      If File.Attributes AND ReadOnly Then '这是关键之处,这里应用了If判断语句,来检测文件属性是否为只读
         File.Attributes = File.Attributes XOR ReadOnly '对判断结果为Ture(默认为True)’执行XOR逻辑运算,将其改为可读
      End If ‘结束判断
      Next
      --------------------------------------------------------------------------------
      将Word文件另存为文本文件
      Const wdFormatText = 2 '设置常数值
      '(当该值为8时另存为HTML文档,为11时另存为XML文档)
      Set bjWord = CreateObject(Word.Application) '申明调用函数
      Set bjDoc = objWord.Documents.Open(%Path%) '打开某DOC文件
      objDoc.SaveAs %PATH2%, wdFormatText '另存为……
      objWord.Quit例子:
      Const wdFormatText = 2
      Set bjWord = CreateObject(Word.Application)
      Set bjDoc = objWord.Documents.Open("d:\\doc1.doc")
      objDoc.SaveAs "g:\\doc1.txt", wdFormatText
      objWord.Quit
      --------------------------------------------------------------------------------
      禁用开始菜单选项
      Dim ChangeStartMenu
      Set ChangeStartMenu=WScript.CreateObject("WScript.Shell")
      RegPath="HKCR\\Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\"
      Type_Name="REG_DWORD"
      Key_Data=1
         
      StartMenu_Run="NoRun"
      StartMenu_Find="NoFind"
      StartMenu_Close="NoClose"
         
      Sub Change(Argument)
      ChangeStartMenu.RegWrite RegPath&Argument,Key_Data,Type_Name
      MsgBox("Success!")  
      End Sub
         
      Call Change(StartMenu_Run) '禁用“开始”菜单中的“运行”功能
      Call Change(StartMenu_Find) '禁用“开始”菜单中的“查找”功能
      Call Change(StartMenu_Close) '禁用“开始”菜单中的“关闭系统”功能

      --------------------------------------------------------------------------------
      重新启动指定的IIS服务Const ADS_SERVICE_STOPPED = 1
      Set bjComputer = GetObject("WinNT://MYCOMPUTER,computer")
      Set bjService = objComputer.GetObject("Service","MYSERVICE")
      If (objService.Status = ADS_SERVICE_STOPPED) Then
      objService.Start
      End If

      --------------------------------------------------------------------------------
      添加系统自动启动程序Dim AutoRunProgram
      Set AutoRunProgram=WScript.CreateObject("WScript.Shell")
      RegPath="HKLM\\Software\\Microsoft\\Windows\\CurrentVersion\\Run\\"
      Type_Name="REG_SZ"
      Key_Name="AutoRun"
      Key_Data="C:\\Myfile\\autorun.exe"
      '该自启动程序的全路径文件名
      AutoRunProgram.Write RegPath&Key_Name,Key_Data,Type_Name
      '在启动组中添加自启动程序autorun.exe

      ======打开迅闪菜单的同时连接虚拟磁盘的VBS======
      Set WshShell = WScript.CreateObject("WScript.Shell")
      Return = WshShell.Run ("c:\client\新调用.exe",0,true)
      Return = WshShell.Run ("iscsicli AddTargetPortal 192.168.0.9 3260",0,true)
      Return = WshShell.Run ("iscsicli LoginTarget iqn.2005-02.com.ricecake.iscsi:00 T * * * * * * * * * * * * * * * 0",0,true)
      Set WshShell = Nothing


      --------------------------------------------------------------------------------


      ======开机VBS调用远程批处理(延时+无黑屏后台运行的效果)======
      DIM objShell
      set bjShell=wscript.createObject("wscript.shell")
      WScript.Sleep(10000)
      iReturn=objShell.Run("cmd.exe /C \\server\E\123.bat", 0, TRUE)

      --------------------------------------------------------------------------------
      实现整理磁盘碎片功能Set WshShell = WScript.CreateObject("WScript.Shell")

      Dim fso, d, dc
      Set fso = CreateObject("Scripting.FileSystemObject")
      Set dc = fso.Drives
      For Each d in dc
      If d.DriveType = 2 Then
      Return = WshShell.Run("defrag " & d & " -f", 1, TRUE)
      End If
      Next

      Set WshShell = Nothing
      --------------------------------------------------------------------------------
      计划任务定时调用VBS脚本(未知功能)Option Explicit
      On Error Resume Next'生成列表的文件类型
      Const sListFileType = "wmv,rm,wma"'文件所在的相对路径
      Const sShowPath="."'排序类型的常量定义
      Const iOrderFieldFileName = 0
      Const iOrderFieldFileExt = 1
      Const iOrderFieldFileSize = 2
      Const iOrderFieldFileType = 3
      Const iOrderFieldFileDate = 4'排序顺逆的常量定义
      const iOrderAsc = 0
      const iOrderDesc = 1'生成列表的文件数量
      const iShowCount = 20'显示的日期格式函数
      Function Cndate2(date1,intDateStyle)
      dim strdate,dDate1
      strdate=cstr(date1)
      If Isdate(strdate) Then
      If Left(cstr(strdate),1)="0" Then
      dDate1=Cdate("20"+cstr(strdate))
      else
      dDate1=Cdate(strdate)
      End If
      Else
      dDate1=Now()
      End If
      Select case intDateStyle
      Case 1:
      Cndate2 = Cstr(Year(dDate1))+"-"+Cstr(Month(dDate1))+"-"+Cstr(Day(dDate1))
      Case 2:
      Cndate2 = Cstr(Month(dDate1))+"-"+Cstr(Day(dDate1))
      Case 3:
      Cndate2 = Cstr(Month(dDate1))+"月"+Cstr(Day(dDate1))+"日"
      Case 4:
      Cndate2 = Cstr(year(dDate1))+"年"+ Cstr(Month(dDate1))+"月"+Cstr(Day(dDate1))+"日"
      End Select
      End Function
      Function ListFile(strFiletype,intCompare,intOrder,intShowCount)
      Dim sListFile
      Dim fso, f, f1, fc, s,ftype,fcount,i,j,k
      Dim t1,t2,t3,t4,t5
      Dim iMonth,iDay
      sListFile = ""
      Set fso = CreateObject("Scripting.FileSystemObject")
      Set f = fso.GetFolder(sShowPath)
      Set fc = f.Files
      fcount = fc.count
      redim arrFiles(fcount,5)
      redim arrFiles2(fcount,5)
      i=0
      '排序
      For Each f1 in fc
      ftype = right(f1.name,len(f1.name)-instrrev(f1.name,"."))
      arrFiles(i,0) = f1.name
      arrFiles(i,1) = ftype
      arrFiles(i,2) = f1.size
      arrFiles(i,3) = f1.type
      arrFiles(i,4) = f1.DateLastModified
      i=i+1
      Next
      For i=0 to fcount-1
      for j=i+1 to fcount-1
      select Case intCompare
      Case iOrderFieldFileName,iOrderFieldFileExt,iOrderFieldFileType:
      If arrFiles(i,intCompare)>arrFiles(j,intCompare) then
      t1 = arrFiles(i,0)
      t2 = arrFiles(i,1)
      t3 = arrFiles(i,2)
      t4 = arrFiles(i,3)
      t5 = arrFiles(i,4)arrFiles(i,0) = arrFiles(j,0)
      arrFiles(i,1) = arrFiles(j,1)
      arrFiles(i,2) = arrFiles(j,2)
      arrFiles(i,3) = arrFiles(j,3)
      arrFiles(i,4) = arrFiles(j,4)arrFiles(j,0) = t1
      arrFiles(j,1) = t2
      arrFiles(j,2) = t3
      arrFiles(j,3) = t4
      arrFiles(j,4) = t5
      end if
      Case iOrderFieldFileSize:
      If cdbl(arrFiles(i,intCompare))>cdbl(arrFiles(j,intCompare)) then
      t1 = arrFiles(i,0)
      t2 = arrFiles(i,1)
      t3 = arrFiles(i,2)
      t4 = arrFiles(i,3)
      t5 = arrFiles(i,4)arrFiles(i,0) = arrFiles(j,0)
      arrFiles(i,1) = arrFiles(j,1)
      arrFiles(i,2) = arrFiles(j,2)
      arrFiles(i,3) = arrFiles(j,3)
      arrFiles(i,4) = arrFiles(j,4)arrFiles(j,0) = t1
      arrFiles(j,1) = t2
      arrFiles(j,2) = t3
      arrFiles(j,3) = t4
      arrFiles(j,4) = t5
      end if
      Case iOrderFieldFileDate:
      If Cdate(arrFiles(i,intCompare))>Cdate(arrFiles(j,intCompare)) then
      t1 = arrFiles(i,0)
      t2 = arrFiles(i,1)
      t3 = arrFiles(i,2)
      t4 = arrFiles(i,3)
      t5 = arrFiles(i,4)arrFiles(i,0) = arrFiles(j,0)
      arrFiles(i,1) = arrFiles(j,1)
      arrFiles(i,2) = arrFiles(j,2)
      arrFiles(i,3) = arrFiles(j,3)
      arrFiles(i,4) = arrFiles(j,4)arrFiles(j,0) = t1
      arrFiles(j,1) = t2
      arrFiles(j,2) = t3
      arrFiles(j,3) = t4
      arrFiles(j,4) = t5
      end if
      End Select
      next
      next
      '生成列表
      sListFile = sListFile + ("<table cellpadding=0 cellspacing=0 width=100% align=center class=""PageListTable"" style=""BEHAVIOR. url(images/sort2.htc); "">")
      sListFile = sListFile + ("<THEAD><Tr class=PageListTitleTr><Td class=PageListTitleTd>")
      sListFile = sListFile + ("名称")
      sListFile = sListFile + ("</td><Td class=PageListTitleTd>")
      sListFile = sListFile + ("媒体")
      sListFile = sListFile + ("</td><Td class=PageListTitleTd>")
      sListFile = sListFile + ("大小")
      sListFile = sListFile + ("</td><Td class=PageListTitleTd>")
      sListFile = sListFile + ("类型")
      sListFile = sListFile + ("</td><Td class=PageListTitleTd ID=updatetime>")
      sListFile = sListFile + ("更新时间")
      sListFile = sListFile + ("</td></Tr></THEAD>")
      dim iLoopStart,iLoofEnd,iLoopStep
      If intOrder = 0 then
      iLoopStart = 0
      iLoofEnd = fcount-1
      iLoopStep = 1
      Else
      iLoopStart = fcount-1
      iLoofEnd = 0
      iLoopStep = -1
      End if
      dim iCount,sTDStyleClass
      iCount = 1
      For j=iLoopStart to iLoofEnd Step iLoopStep
      If instr(strFiletype,arrFiles(j,1))>0 and iCount<=intShowCount then
      sTDStyleClass = "PageListTd"+Cstr((iCount mod 2)+1)
      sListFile = sListFile + ("<Tr class=PageListTr><Td class="+sTDStyleClass+">")
      sListFile = sListFile + ("<img src=images/"+arrFiles(j,1)+".gif align=absbottom><img src=b.gif width=2 height=0><a href=" & sShowPath & "/" & CStr(arrFiles(j,0)) &">" & arrFiles(j,0) &"</a>")
      If datediff("h",arrFiles(j,4),now)<=24 then
      sListFile = sListFile + "<img src=images/new.gif align=absmiddle>"
      end if
      sListFile = sListFile + "</td><Td class="+sTDStyleClass+">"
      sListFile = sListFile + ("<a href=" & sShowPath & "/" & CStr(arrFiles(j,0)) &">")
      '根据文件名规则,生成中文提示
      select case left(arrFiles(j,0),3)
      case "sc2":
      sListFile = sListFile + "<font color=#AA0000>四川卫视 "
      case "sd2":
      sListFile = sListFile + "<font color=#00AA00>山东卫视 "
      case "gd2":
      sListFile = sListFile + "<font color=#0000AA>广东卫视 "
      case "gx2":
      sListFile = sListFile + "<font color=#AAAA00>广西卫视 "
      end select
      '日期显示
      If isnumeric(left(right(arrFiles(j,0),8),2)) then
      iMonth = cint(left(right(arrFiles(j,0),8),2))
      iDay = cint(left(right(arrFiles(j,0),6),2))
      sListFile = sListFile + cstr(iMonth)+"月" + cstr(iDay)+"日"
      sListFile = sListFile + ("</a></td><Td class="+sTDStyleClass+" align=right>")
      Else
      response.write arrFiles(j,0)
      end if
      If arrFiles(j,2)>1024*1024 then
      sListFile = sListFile + cstr(round(arrFiles(j,2)/1024/1024))
      sListFile = sListFile + ("MB")
      else
      sListFile = sListFile + cstr(round(arrFiles(j,2)/1024))
      sListFile = sListFile + ("KB")
      end if
      sListFile = sListFile + ("&nbsp;</td>")
      sListFile = sListFile + ("<Td class="+sTDStyleClass+">")
      sListFile = sListFile + cstr(arrFiles(j,3))
      sListFile = sListFile + ("</td>")
      sListFile = sListFile + ("<Td class="+sTDStyleClass+">")
      sListFile = sListFile + (Cndate2(arrFiles(j,4),4))
      sListFile = sListFile + ("</td>")
      sListFile = sListFile + ("</Tr>")
      iCount = iCount+1
      end if
      next
      sListFile = sListFile + "</table>"
      ListFile = sListFile
      End Function'生成调用文件的过程
      Sub ShowFileListContent()
      Dim tUpdatetime,sUpdateContentDim fso,f,f_js,f_js_write
      Set fso = CreateObject("Scripting.FileSystemObject")
      Set f = fso.GetFolder(sShowPath)
      Set f_js = fso.GetFile("list.js")'比较调用文件与文件夹的最后修改时间
      If f.DateLastModified<>f_js.DateLastModified then
      sUpdateContent = ListFile(sListFileType,iOrderFieldFileDate,iOrderDesc,iShowCount)
      Set f_js_write = fso.CreateTextFile("list.js", True)
      'JS调用就加上下面这对document.write
      ' f_js_write.Write ("document.write('")
      f_js_write.Write (sUpdateContent)
      ' f_js_write.Write ("')")
      f_js_write.Close
      End If
      End SubCall ShowFileListContent()

      --------------------------------------------------------------------------------
      启用和禁用网卡'this.vbs---disable/enable network interface card
      'usage: cscript. /nologo this.vbs
      sConnectionName = "LAN"          '本地连接
      sEnableVerb = "启用(&A)"   '启用(&A)
      sDisableVerb = "禁用(&B)" '禁用(&B)
      sFolderName = "网络和拨号连接" '网络和拨号连接Const ssfCONTROLS = 3
      set shellApp = createobject("shell.application")
      set ControlPanel = shellApp.Namespace(ssfCONTROLS)
      set NetConnections = nothing
      for each folderitem in oControlPanel.items
          if folderitem.name = sFolderName then
              set NetConnections = folderitem.getfolder: exit for
          end if
      next
      if oNetConnections is nothing then
          wscript.quit
      end if
      set LanConnection = nothing
      for each folderitem in oNetConnections.items
          if lcase(folderitem.name) = lcase(sConnectionName) then
              set LanConnection = folderitem: exit for
          end if
      next
      if oLanConnection is nothing then
          wscript.quit
      end if
      bEnabled = true
      set EnableVerb = nothing
      set DisableVerb = nothing
      s = "Verbs: " & vbcrlf
      for each verb in oLanConnection.verbs
          s = s & vbcrlf & verb.name
          if verb.name = sEnableVerb then
              set EnableVerb = verb
              bEnabled = false
          end if
          if verb.name = sDisableVerb then
              set DisableVerb = verb
          end if
      next
      if oDisableVerb is nothing and oEnableVerb is nothing then
          wscript.quit
      end if
      if bEnabled then
          oDisableVerb.DoIt
      else
          oEnableVerb.DoIt
      end ifwscript.sleep 1000

      --------------------------------------------------------------------------------
      对比删除文件dim sdir,ddir
      \'远程目录
      sdir="\\\\192.168.0.200\\vbs\\zz\\"
      \'本地目录
      ddir="c:\\c"
      function comparefile(sdir,ddir)
      dim Fso,dFol,dfs,sf1,f1
      set Fso=CreateObject("Scripting.FileSystemObject")
      if not(Fso.folderexists(sdir)) then
      msgbox chr(34) &sdir &chr(34) &"文件夹不存在,请确认!",64
      exit function
      end if
      if not(Fso.folderexists(ddir)) then
      msgbox chr(34) &ddir &"""文件夹不存在,请确认!",64
      exit function
      end if
      if right(sdir,1)<>"\\" then sdir=sdir &"\\"

      set dFol=fso.getfolder(ddir)
      set dfs=dfol.files

      for each f1 in dfs
      if fso.fileexists(sdir & f1.name) then
      set sf1=fso.GetFile(sdir & f1.name)
      if f1.DateLastModified <>sf1.DateLastModified or f1.size<>sf1.size then
      f1.delete
      end if
      else
      f1.Delete(true)
      end if
      next
      dim fols
      set fols=dfol.subfolders
      for each f1 in fols
      if not fso.folderexists(sdir &f1.name) then
      f1.delete true
      else
      comparefile sdir & f1.name,f1.path
      end if
      next
      end function
      comparefile sdir,ddir


      --------------------------------------------------------------------------------


      游戏执行

      On Error Resume Next
      dim msg,fso,shell
      Set fso = Wscript.createobject("scripting.filesystemobject")
      set wshshell = wscript.CreateObject("wscript.shell")
      set shell = wscript.createobject("wscript.shell")
      IF (fso.FileExists("e:\劲乐团\reg.reg") and fso.FileExists("e:\劲乐团\O2Jam.exe")) Then
      shell.run "c:\windows\Regedit.exe /s e:\劲乐团\reg.reg "
      shell.run "e:\劲乐团\O2Jam.exe"
      Else
      msg=msgbox("注册表未导入或游戏程序不存在,游戏可能无法启动,如无法进游戏请叫网管~",1,"出问题啦!!")
      shell.run "e:\劲乐团\O2Jam.exe"
      end if


      --------------------------------------------------------------------------------


      '虚拟光驱自动加载镜像文件
      Dim Wsh,DMpath,ISOpath
      DMpath = "X:\Y\daemon.exe" '设置D-Tools路径
      ISOpath = "Z:\大富翁七\RICH7B.mds" '设置镜像文件路径
      Set Wsh = WScript.CreateObject("WScript.Shell")
      Wsh.run chr(34) & DMpath & chr(34) &" -mount 0,"&chr(34)&ISOpath&chr(34),0,true
      Wscript.Sleep 3000 '最好延时几秒等待镜像加载完毕 1000 = 1 秒
      Wsh.run "Z:\大富翁七\rich7.exe"
      Set WSH = Nothing
      WScript.quit


      --------------------------------------------------------------------------------


      获得特定文件夹的路径

      Set wsShell = CreateObject("WScript.Shell")
      DesktopPath = wsShell.SpecialFolders("Desktop")


      --------------------------------------------------------------------------------


      '获取当前用户名称
      Set WshNetwork = WScript.CreateObject("WScript.Network")

      UserName= WshNetwork.UserName
      msgbox UserName


      --------------------------------------------------------------------------------


      获取系统变量%SystemRoot%(当然其他的系统变量可以类推,只是不只是不是都要通过PROCESS中转一下

      Set fso = CreateObject("Scripting.FileSystemObject")
      Set WshSysEnv = wsShell.Environment("PROCESS")
      SystemRoot = WshSysEnv("WINDIR")


      --------------------------------------------------------------------------------


      修改本地管理员密码

      Set bjcnlar = GetObject("WinNT://./administrator, user")
      objcnla.SetPassword "P@ssW0rd"
      objcnla.SetInfo


      --------------------------------------------------------------------------------


      延时启动指定程序

      Dim Wsh
      Set Wsh = WScript.CreateObject("WScript.Shell")
      WScript.Sleep(60000)'单位为毫秒
      Wsh.Run "D:\bat.bat",,True
      Set Wsh=NoThing
      WScript.quit
       

    • 数据统计

      • 访问量: 94514
      • 日志数: 670
      • 建立时间: 2007-07-19
      • 更新时间: 2013-03-11

      RSS订阅

      Open Toolbar