发布新日志

  • 揭秘QTP之Reporter对象

    2012-07-13 15:10:07

    揭秘QTP之Reporter对象

    2008-10-23 作者:陈能技 来源:IT168

     

    本文介绍了Reporter对象的几个鲜为人知的方法,利用LogEvent、SetContext、UnSetContext方法,可以实现日志的结构化、层次化写入,让你的QTP测试报告看起来更加有条理、分类清晰。

    QTP的日志其实有很多的缺点,尤其是当你的脚本依赖函数来执行的时候,因为函数执行时调用Reporter对象来写日志,只会顺序从上到下、扁平、不分类地写下去,如图1所示。

    图1 函数执行时调用Reporter对象写日志的问题

    而不像在Action中写日志一样,按一定的层次关系来写日志(例如根据调用的关系嵌套)。那么如何让函数调用Reporter对象来写日志时也具备一定的层次关系,让日志展现更加灵活、分类清晰呢?其实QTP的Report对象中暗藏了不少可利用的属性和方法。

    Report对象的“私家珍藏”

    在关键字视图通过InterlliSense查看QTP的Report对象时(如图2所示),可发现仅有3个属性、1个方法可用,其中最常用的是ReportEvent方法。

    图2 Reporter对象的公开方法和属性

    而实际上,QTP的Report对象还有其他的方法可用,这些方法并没有对外公开,例如可用LogEvent方法来在日志树中写入一个节点:

    ' 使用Reporter对象的LogEvent写入新节点
    intContext = Reporter.LogEvent("User", dicMetaDescription, Reporter.GetContext)

    用SetContext方法把某个节点作为父节点,这样的话,后续写入的Log都将在这个父节点之下:

    ' 调用Reporter对象的SetContext把新写入的节点作为父节点
    Reporter.SetContext intContext

    如果要退出该节点,返回日志树的上一层,则可调用UnSetContext方法即可,如下脚本所示:

    '调用Reporter对象的UnSetContext,返回上一层
    Reporter.UnSetContext

    Report对象“解密”

    有了LogEvent、SetContext、UnSetContext这几个方法,我们就可以实现日志的结构化、层次化写入了,例如下面的例子所示:

    ' 用一个Dictionary对象来存储节点的信息
    Set dicMetaDescription = CreateObject("Scripting.Dictionary")

    ' 设置节点的状态
    dicMetaDescription("Status") = MicDone

    ' 设置节点的名称
    dicMetaDescription("PlainTextNodeName") = "父节点"

    ' 设置节点的详细描述信息(可以使用HTML格式)
    dicMetaDescription("StepHtmlInfo") = "<DIV align=left><H1>这是一个拥有孩子的节点</H1><b>Hello!</b> How are you!.</DIV>"

    ' 设置节点的图标
    dicMetaDescription("DllIconIndex") = 210
    dicMetaDescription("DllIconSelIndex") = 210

    ' 节点图标从ContextManager.dll这个DLL文件中读取
    dicMetaDescription("DllPAth") = "D:\Program Files\HP\QuickTest Professional\bin\ContextManager.dll"

    ' 使用Reporter对象的LogEvent写入新节点
    intContext = Reporter.LogEvent("User", dicMetaDescription, Reporter.GetContext)

    ' 调用Reporter对象的SetContext把新写入的节点作为父节点
    Reporter.SetContext intContext

    ' 后续写入的Log都将在这个父节点之下
    Reporter.ReportEvent MicPass, "Step1", "Step1 Pass!"
    Reporter.ReportEvent MicWarnning, "Step2", "Step2 Pass With Warnning!"
    Reporter.ReportEvent MicFail, "Step2", "Step2 Fail!"
    '调用Reporter对象的UnSetContext,返回上一层
    Reporter.UnSetContext

    ' 在父节点之外写Log
    Reporter.ReportEvent MicPass, "Case2", "Case2 Pass!"

    在这个例子中,我们首先用一个Dictionary对象来存储节点的信息,其中Status表示节点的状态,例如MicDone就表示完成状态;PlainTextNodeName表示节点的名称;StepHtmlInfo表示节点的详细内容,可以用HTML格式来写入;还可以用DllIconIndex、DllIconSelIndex、DllPAth这3个属性来表示节点的图标。

    然后使用Reporter对象的LogEvent把Dictionary中存储的信息写入一个新节点,再调用Reporter对象的SetContext把新写入的节点作为父节点,这样后续写入的Log都将在这个父节点之下,最后调用Reporter对象的UnSetContext,返回上一层,这样后续写入的Log将在这个父节点之外。

    这个例子的运行结果如图3所示。

    图3 脚本运行结果

    封装成可重用的函数

    可以把上面的代码封装成一个可重用的函数,以方便调用。方法如下:

    (1)首先在QTP中使用“Function Definition Generator”来定义一个名为“EnterNode”的函数。如图4所示。

    图4 定义函数EnterNode

    该函数实现的是把日志写入某个节点下,输入参数为NodeName(节点的名称),NodeContent(节点的描述信息)。

    函数的脚本如下:

    '@Description 指定把日志写入节点下
    Public Function EnterNode(ByRef NodeName, ByRef NodeContent)

    ' 用一个Dictionary对象来存储节点的信息
    Set dicMetaDescription = CreateObject("Scripting.Dictionary")

    ' 设置节点的状态
    dicMetaDescription("Status") = MicDone

    ' 设置节点的名称
    dicMetaDescription("PlainTextNodeName") = NodeName

    ' 设置节点的详细描述信息(可以使用HTML格式)
    dicMetaDescription("StepHtmlInfo") = NodeContent

    ' 设置节点的图标
    dicMetaDescription("DllIconIndex") = 210
    dicMetaDescription("DllIconSelIndex") = 210

    ' 节点图标从ContextManager.dll这个DLL文件中读取
    dicMetaDescription("DllPAth") = "D:\Program Files\HP\QuickTest Professional\bin\ContextManager.dll"

    ' 使用Reporter对象的LogEvent写入新节点
    intContext = Reporter.LogEvent("User", dicMetaDescription, Reporter.GetContext)

    ' 调用Reporter对象的SetContext把新写入的节点作为父节点
    Reporter.SetContext intContext
    End Function

    (2)然后再定义一个与“EnterNode”相应的函数“ExitNode”,如图5所示:

    图5 定义函数ExitNode

    ExitNode函数用于退出当前日志节点,需要与EnterNode配对使用,函数的脚本如下所示:

    '@Description 退出当前日志节点(与EnterNode配对使用)
    Public Function ExitNode
    '调用Reporter对象的UnSetContext,返回上一层
    Reporter.UnSetContext
    End Function

    (3)有了EnterNode和ExitNode函数后,我们就可以像下面的例子一样使用EnterNode和ExitNode,实现日志记录的结构化、层次化写入:

    ' 进入节点
    EnterNode "父节点","<DIV align=left><H1>这是一个拥有孩子的节点</H1><b>Hello!</b> How are you!.</DIV>"

    ' 在节点内写Log
    Reporter.ReportEvent MicPass, "Step1", "Step1 Pass!"
    Reporter.ReportEvent MicWarnning, "Step2", "Step2 Pass With Warnning!"
    Reporter.ReportEvent MicFail, "Step2", "Step2 Fail!"

    ' 退出节点
    ExitNode

    ' 在节点之外写Log
    Reporter.ReportEvent MicPass, "Case2", "Case2 Pass!"

    该脚本首先调用EnterNode,创建一个"父节点",并自动进入该节点的层次下,然后使用普通的ReportEvent方法写日志,当需要退出该"父节点"时,就调用一下ExitNode,则后续的日志都在该节点之外写。

    小结

    本文介绍了Reporter对象的几个鲜为人知的方法,利用LogEvent、SetContext、UnSetContext这几个方法,可以实现日志的结构化、层次化写入,让你的QTP测试报告看起来更加有条理、分类清晰。

    不知道为什么QTP的帮助文档中没有列出这几个有用的方法,但是不管怎样,在我们揭开了Reporter对象的这些隐藏的方法后,我们就可以充分利用它们为我们服务,让我们的自动化测试脚本更加强大。

  • QTP中Wait与同步点的区别

    2012-07-10 16:27:50

    先说wait函数,当脚本走到wait函数时,就开始执行这个函数.如:wait(10),就等待10秒种后再继续执行下面的语句.wait函数的这个等待的时间,那相对来说是比较固定的.如上例子,一定要等待完10秒后再执行.所以写脚本的时候要自己估算一下时间.不然可能造成时间的浪费,或者等待时间的不足.

        那同步点呢.等待时间就比较灵活了,它的等待时间是不固定的.设置同步点后,当脚本执行到这句话后,脚本就开始执行等待.脚本会在规定时间内不断的去检查,所同步的对象有没有出现,一但出现,脚本就继续往下执行.不需要等完所有规定时间.如果在规定的时间内,所要同步对象还没有出现,那就提示超时的错误信息.

    Window("Flight Reservation").ActiveX("Threed Panel Control").WaitProperty "text", "Insert Done...", 10000


        当脚本执行到这句话时,就开始执行同步等待时间.这里设置超时时间为10000毫秒(10秒).在这个时间内,脚本会不断去查看该对象的text属性的属性值Insert Done...,有没有出现.一但同步到这个属性值,就开始执行下面的脚本了.而不需要再继续等待,直到1000秒结束为止.那这样的话,这个等待时间不用自己去控制,设置好后由程序自己去判断,就比较灵活,也不会出现浪费时间的情况.能提高脚本的执行率.

    举例:

    Sub WaitProperty_Example()
    'The following example uses the WaitProperty method to make the
    'test wait until the ActiveX "Calendar" object is enabled, or for
    '5 seconds (5000 milliseconds) to pass. If the object is enabled before
    '4 seconds pass, QuickTest clicks the object.
    With Window("Date").ActiveX("Calendar")
        If .WaitProperty("Enabled", True, 5000) = False Then
            Reporter.ReportEvent 1, "Calendar", "Object Disabled"
        Else
            .Click 95, 100
        End If
    End With
    End Sub
  • GetROProperty,GetTOProperties,GetTOProperty区别

    2012-07-10 16:25:19

    原文地址:http://bbs.51testing.com/thread-87074-1-2.html  作者:yabest

    呵呵,这个文章本来是在给别人的帖《GetROProperty,GetTOProperties,GetTOProperty的区别》回复时写的,没有独立出来。
    http://bbs.51testing.com/viewthread.php?tid=13554&page=1#pid369327
    写完后,在网上被多处转载。没想到今天又被转贴回51testing来了。

    虽然在精华版里,也赚了几朵花,但没独立总是不方便。所以修整了一下,独立成帖,以方便大家阅读。
    欢迎大家拍砖!(当然更欢迎大家送花sdlkfj5)


    一、QTP识别对象的原理(by yabest)

    QTP里的对象有两个概念,一个是Test Object(简称TO),一个是Runtime Object(简称RO)。
    这两个概念从字面上不大好理解,也容易混淆。
    但从实际作用上来看,应该说TO就是是仓库文件里定义的仓库对象,RO是被测试软件的实际对象。

    QTP识别对象,一般是要求先在对象仓库文件里定义仓库对象,里面存有实际对象的特征属性的值。
    然后在运行的时候,QTP会根据脚本里的对象名字,在对象仓库里找到对应的仓库对象,
    接着根据仓库对象的特征属性描述,在被测试软件里搜索找到相匹配的实际对象,最后就可以对实际对象进行操作了。

    仓库对象TO一般在录制/编写脚本时加入仓库文件,它不仅可以在录制编写时进行修改,
    也可以在运行过程中进行动态修改,以匹配实际对象。

    和TO、RO相关的几个函数有:

    GetTOProperty():取得仓库对象的某个属性的值
    GetTOProperties():取得仓库对象的所有属性的值
    SetTOProperty():设置仓库对象的某个属性的值

    GetROProperty():取得实际对象的某个属性的值

    (注:这几个函数访问的都是对象的封装属性,不是对象的自身属性,封装属性和自身属性的区别详见后面第二章QTP操作对象的原理)

    理解了TO的含义,你就可以自由的用SetTOProperty()定义TO,以灵活的操作RO

    比如有个测试任务,窗口上有很多待检查的记录,每条记录右边都有一个Check按钮,用来检查各条记录。
    记录个数不定,所以Check按钮个数也就不定,只有一个Edit显示记录个数。
    我们要对每条记录进行检查,也就是要点击每个Check按钮。
    但是Check按钮个数不定,不好录制,而且个数可能也很多(上百个),即使能一一录制,那也很麻烦。

    那我有一个好办法,只录制一个按钮对象,它设有两个特征属性 label=OK, index=0
    然后用下面的脚本,就可以完成测试

    buttonNum = CInt(JavaWindow("Test").JavaEdit("Record Num").GetROProperty("value"))
    For buttonIndex = 0 to buttonNum - 1
      JavaWindow("Test").JavaButton("Check").SetTOProperty("index", buttonIndex)
      JavaWindow("Test").JavaButton("Check").Click
    Next


    或者窗口上有New、Modify、Delete、Check等好几个按钮,要把这几个按钮一一按过去
    我在对象仓库里只设置一个按钮对象AnyButton,label特征属性值填任意值,然后用下面脚本执行测试

    JavaWindow("Test").JavaButton("AnyButton").SetTOProperty("label", "New")
    JavaWindow("Test").JavaButton("AnyButton").Click

    JavaWindow("Test").JavaButton("AnyButton").SetTOProperty("label", "Modify")
    JavaWindow("Test").JavaButton("AnyButton").Click

    JavaWindow("Test").JavaButton("AnyButton").SetTOProperty("label", "Delete")
    JavaWindow("Test").JavaButton("AnyButton").Click

    JavaWindow("Test").JavaButton("AnyButton").SetTOProperty("label", "Check")
    JavaWindow("Test").JavaButton("AnyButton").Click

    另外,QTP还支持脚本描述的方法来定义和访问对象,即不需要在仓库里定义,也能访问和操作实际对象
    ( Written by yabest )

    如上面两个任务,可以如下实现

    1. 不需要在仓库里定义Check按钮对象,直接用下面脚本来实现测试

    buttonNum = CInt(JavaWindow("Test").JavaEdit("Record Num").GetROProperty("value"))
    For buttonIndex = 0 to buttonNum - 1
      JavaWindow("Test").JavaButton("label:=Check", "index:="+CStr(buttonIndex)).Click
    Next

    2. 不需要在仓库里定义New、Modify、Delete、Check按钮对象,直接用下面脚本来实现测试

    JavaWindow("Test").JavaButton("label:=New").Click
    JavaWindow("Test").JavaButton("label:=Modify").Click
    JavaWindow("Test").JavaButton("label:=Delete").Click
    JavaWindow("Test").JavaButton("label:=Check").Click

     二、讲解和举例。

     

       GetToProperty: Returns the value of the specified property from the test object description.

         GetTOProperties: Returns the collection of properties and values used to identify the object.

         GetROProperty: Returns the current value of the test object property from the object in the application.

         举个例子:假设在库中有一个对象"窗口A",用于识别该对象的属性有2个,一个属性是"text",在库中记录的值是"QQQQ".另一个属性是"name",记录的值是"MM".在实际运行脚本时属性"text"的值是"PPPP"而不是"QQQQ".那么:Window("窗口A").GetToProperty("text")返回的是:"QQQQ".Window("窗口A").GetRoProperty("text")返回的是:"PPPP"。Window("窗口A").GetToProperties("text")返回的是用于识别"窗口A"的两个属性和值的集合 . 一个好助手——Object Spy通过Object Spy可以查看到所需要识别的Web对象的所有属性值,挑选其中可以唯一识别该对象的一个属性或多个属性,对该Web对象进行描述。

     
  • sql注入测试

    2010-06-25 11:24:42

  • 谈谈对软件测试职业发展

    2010-06-22 23:47:20

      在面试的过程经常会谈到对职业的发展,从测试行业就目前来说,要想拿到比较理想的待遇,要有自己的特点,就目前接触的同仁,很多只会的手工测试和会一些管理工具,如QC,JIRA等,像这样的工具应该是每一位测试人员都应该掌握的,要想更好的成长认为可以从两个方向规划。

      一、如果对自动化和性能不感兴趣,或者自身能力欠缺,建议你朝linux方向发展,做系统测试工程师,现在很多系统环境使用linux,学会各种服务和测试环境的配置,掌握一些shell简单编程和数据库知识。

       二、朝自动化和性能方向发展,虽然目前行业能做自动化架构和很牛性能测试工程师的不是很多,发展的空间还是相当大的,待遇也是相当不错的。

      以上两个方向都可以朝管理的方向去发展,能坐上管理的位置,认为至少要学会一种,要不然只有整天抱怨薪水太少。呵呵!

  • 如何避免开发产生更多bug。

    2010-06-21 20:06:54

       最近想了想在我负责的项目和产品中bug数量越来越少,质量也不错,得到了领导的好评及赞赏,经过两个项目的使用这方法能扼杀30%以上的bug,现将该方法阐述如下:

       方式就是:统计bug库中将bug归类形成简单的文档发给开发人员,在开发编码之前,组织一次会议将bug库中出现概率较大的,容易出现问题的功能模块,拿出来跟开发讲,形成一些决议,每个开发的能力和经验不同,在这里可以统一,如果再犯可以在会议上提出批评,这样下来在测试过程中BUG的数量大大大减少。质量也不错哦,不行你试试。

  • IDS项目成功经验总结

    2010-06-20 18:51:09

                                 IDS5.0项目总结
             经过项目成员和公司全体人员的共同努力,在项目经理的领导下IDS5.0已经成功发布上线。作为项目测试负责人从中学习了很多项目经验。在整个项目中测试预期与测试执行情况在整个测试项目是比较成功的,项目的时间执行情况和预期的测试指标度量都比较接近。回顾项目的测试过程,总结以下项目测试经验。
             基于以往的测试经验,我们也越来越认识到测试人员应该尽早介入项目的重要性。在IDS5.0项目中测试工作从一开始项目立项就介入,参加项目小组会议和用户需求评审。如果简单地沿用测试V模型往往出现很多问题,特别是在项目进度拖延的情况下更是如此。如果测试人员一味固执地被要求严格按照V模型定义的标准来开展测试工作的话,则结果往往是在项目初期测试人员工作量极度不饱和(很多测试人员无所事事),而到了项目后期,一旦项目经理决定压缩测试时间,测试人员就不得不加班加点地工作。
    总结开发各个阶段的测试情况
    项目开发期的测试:
    开发时期当系统处于雏型时,测试人员登录开发环境中查看系统,这是不必考虑功能问题,因为一些其他模块没有完成开发,导致业务流程不通畅,这个时候可以注意一些易用性和业务流程操作布局。同时要收集系统需求,尤其是系统变更后的新需求,维护和编写测试用例。
        项目成熟期测试:
        随着项目功能不断完成,主要功能的实现已经趋于完善,关键路径的测试已经不成问题。此时的程序员们,压力已经大大减轻,他们的工作重点也从“构建”转移到了“修复Bug”,这个阶段程序人员对于Bug的接受程度是最高的,对Bug的修复和反馈也非常积极。于是,此时的测试工作应对整个产品的细节和所有路径进行覆盖测试,保证测试的全面性,层层深入地测试产品值得测试的各个部分,尽可能多的发现并报告Bug,要积极协助和配置开发重现BUG,在IDS5.0项目中为了保证每个可测试版本质量,由开发人员负责执行测试提供的单元测试用例或开发编写单元测试用例,如果没有通过单元测试,就不会提交测试申请表,在这份表格中,不仅会明确版本号,修改或新增的功能详细说明,还会给测试人员提供此版本的测试重点,以及可能会影响到的功能。这些内容对测试人员都是至关重要和大有很大帮助。
        项目联调时测试
    在这个阶段,由于任务工作量大,开发进度已经延期了,测试负责人通过与项目经理沟通提前准备好联调所需外围系统和测试环境,IDS5.0联调涉及到系统范围之广泛,其他外围系统必须提交一个稳定或真对IDS5.0开发的版本,这方面有些沟通不足,其他外围系统不能按时提交和修改版本。
    1.       提前组织测试人员进行业务流程培训
    让以前没有介入测试工作的同事了解业务测试流程,测试工作进入联调阶段,得到其他外围系统测试人员的支持。
    2.       提前准备测试环境
    包括数据库环境,操作系统和测试服务器,以及复杂集群环境尤其是联调阶段,IDS4.0迁移数据库提前3天从外网同步下来。
    3.       提前准备系统联调测试用例
    IDS5.0联调测试用例经过测试组评审,并将各个模块功能交付给各个系统测试负责人补充完整,让他们知道各系统应该在联调中侧重测试那些功能。
             联调时期也是BUG产生最多的阶段,所以版本的提交是比较频繁的。在遇到严重的BUG时候及时反馈给开发主管和项目经理,立即终止了该版本的测试,测试人员可以连接到开发环境中验证BUG修复情况,这样可以避免BUG在现。后期IDS5.0版本控制不稳定,开发应该没有做冒烟测试,出现上一个版本没问题,这一个版本中出现问题,这样势必对测试造成很大的工作量,影响系统质量。
    项目的优化期测试
             项目的优化期主要升级系统操作的易用性测试。项目组成员都使用系统必须提出易用性修改建议。
    升级演练时的测试
             与以往的系统升级不同的IDS5.0升级涉及公司所有系统的升级和修改。测试组组织了在演练环境中的测试,做到查漏补缺,在发布升级前做实际业务操作与测试结合补充数据流。
     
             在整个项目过程中,如果是按照6.30的时间发布,整个联调和演练工作都是不够充分的,因为IDS5.0升级涉及到工作所有系统升级和修改,虽然延长20多天,我觉得还是比较值的。所以测试需要有充分时间来完成。
     
    做到与程序员共享信息,比如项目的计划、设计文档的早期草案和早期原型等,测试工作会更加有效。越早与程序员接触,情况就越好。尽早提出你的意见和反馈,了解程序员提交前完成的工作。测试人员有机会能够发现很多存在的问题,比如:需求和设计以及开发的不一致性,项目计划中工作任务的缺失等等。测试人员不要仅局限于测试工作本身,及时验证和发现项目环节中的问题。

  • 下班之后与开发聊天效果。

    2010-06-20 18:26:18

       我公司很少加班,下班之后过半个钟才回家,因为路上实在是太堵了,不容易挤上去。在公司下班之后呢,经常走到开发和业务受理人员的(业务受理人员也就是用户)位置上找他们聊天我,话题经常聊到,关于项目的系统实现。这些东西对项目的测试是相当有帮助的。

       从与开发人员聊天的过程可以,了解系统是如何实现,有哪些服务,中间层是如何实现的,系统服务又是如何实现的,系统接口是采用什么方式,webservice,还是其他方式,这些聊天信对你以后的测试,无任是对功能测试还是性能测试都很有帮助的。如果做性能测试的话,前端估计不是系统出现瓶颈的地方,中间层或者中间服务才能系统的瓶颈。

        与业务受理人员聊天可以清楚的知道你的用例是否好,测试的数据流是否正确。哪些没有覆盖到。需要加强的地方。

      茶余饭后都是可以聊聊技术的。

  • 测试历程

    2010-06-20 18:06:09

    时间过的真快,现以工作快4年了,总想静下心来写点什么,一直没有能静下心来。从开始程序员,到软件测试工程师,在到软件项目测试经理,最后到测试主管。职业发展一直很顺利,总结一下能成就我的有以下几点: 1.积极主动,别人没有察觉的小事你要积极去坐如:公司断电服务器开机,主动找开发了解项目进度,跟踪bug,积极向上级汇报产品质量,项目进度。 2.积极发邮件,有些事做了当然要让上级知道,遇到产品质量问题,项目进度延迟,要及时通过E-mail告知项目组和领导。 3.从这几年来,技术当然特别重要,做过开发,写过代码确实对以后的测试职业帮助不少,通过对代码理解,能够发生更深层次的Bug,大家可以多学习些语言可以不需要精通但需要基础的如:linux,java,C++ PHP,JS ,MYSQL等等。 4.业务理解,这个是特别重要。对业务不理解也就无发测试数据流的流向是否正确。

    先写到这里,待续

  • mysql常用命令

    2010-06-20 18:03:31

    关键字: mysql

    MySql常用命令总结

    启动数据库:net start mysql
    关闭数据库:net stop mysql

    1:使用SHOW语句找出在服务器上当前存在什么数据库:
    mysql> SHOW DATABASES;

    2:2、创建一个数据库MYSQLDATA
    mysql> Create DATABASE MYSQLDATA;

    3:选择你所创建的数据库
    mysql> USE MYSQLDATA; (按回车键出现Database changed 时说明操作成功!)
    4:查看现在的数据库中存在什么表
    mysql> SHOW TABLES;

    5:创建一个数据库表
    mysql> Create TABLE MYTABLE (name VARCHAR(20), sex CHAR(1));

    6:显示表的结构:
    mysql> DESCRIBE MYTABLE;

    7:往表中加入记录
    mysql> insert into MYTABLE values ("hyq","M");

    8:用文本方式将数据装入数据库表中(例如D:/mysql.txt)
    mysql> LOAD DATA LOCAL INFILE "D:/mysql.txt" INTO TABLE MYTABLE;

    9:导入.sql文件命令(例如D:/mysql.sql)
    mysql>use database;
    mysql>source d:/mysql.sql;

    10:删除表
    mysql>drop TABLE MYTABLE;

    11:清空表
    mysql>delete from MYTABLE;

    12:更新表中数据
    mysql>update MYTABLE set sex="f" where name='hyq';


    以下是
    摘自:http://www1.xjtusky.com/article/htmldata/2004_12/3/57/article_1060_1.html

    在windows中MySql以服务形式存在,在使用前应确保此服务已经启动,未启动可用net start mysql命令启动。而Linux中启动时可用“/etc/rc.d/init.d/mysqld start"命令,注意启动者应具有管理员权限。
    刚安装好的MySql包含一个含空密码的root帐户和一个匿名帐户,这是很大的安全隐患,对于一些重要的应用我们应将安全性尽可能提高,在这里应把匿名帐户删除、 root帐户设置密码,可用如下命令进行:
    use mysql;
    delete from User where User="";
    update User set Password=PASSWORD('newpassword') where User='root';
    如果要对用户所用的登录终端进行限制,可以更新User表中相应用户的Host字段,在进行了以上更改后应重新启动数据库服务,此时登录时可用如下类似命令:
    mysql -uroot -p;
    mysql -uroot -pnewpassword;
    mysql mydb -uroot -p;
    mysql mydb -uroot -pnewpassword;
    上面命令参数是常用参数的一部分,详细情况可参考文档。此处的mydb是要登录的数据库的名称。
    在进行开发和实际应用中,用户不应该只用root用户进行连接数据库,虽然使用root用户进行测试时很方便,但会给系统带来重大安全隐患,也不利于管理技术的提高。我们给一个应用中使用的用户赋予最恰当的数据库权限。如一个只进行数据插入的用户不应赋予其删除数据的权限。MySql的用户管理是通过 User表来实现的,添加新用户常用的方法有两个,一是在User表插入相应的数据行,同时设置相应的权限;二是通过GRANT命令创建具有某种权限的用户。其中GRANT的常用用法如下:
    grant all on mydb.* to NewUserName@HostName identified by "password" ;
    grant usage on *.* to NewUserName@HostName identified by "password";
    grant select,insert,update on mydb.* to NewUserName@HostName identified by "password";
    grant update,delete on mydb.TestTable to NewUserName@HostName identified by "password";
    若要给此用户赋予他在相应对象上的权限的管理能力,可在GRANT后面添加WITH GRANT OPTION选项。而对于用插入User表添加的用户,Password字段应用PASSWORD 函数进行更新加密,以防不轨之人窃看密码。对于那些已经不用的用户应给予清除,权限过界的用户应及时回收权限,回收权限可以通过更新User表相应字段,也可以使用REVOKE操作。
    下面给出本人从其它资料(www.cn-java.com)获得的对常用权限的解释:
    全局管理权限:
    FILE: 在MySQL服务器上读写文件。
    PROCESS: 显示或杀死属于其它用户的服务线程。
    RELOAD: 重载访问控制表,刷新日志等。
    SHUTDOWN: 关闭MySQL服务。
    数据库/数据表/数据列权限:
    Alter: 修改已存在的数据表(例如增加/删除列)和索引。
    Create: 建立新的数据库或数据表。
    Delete: 删除表的记录。
    Drop: 删除数据表或数据库。
    INDEX: 建立或删除索引。
    Insert: 增加表的记录。
    Select: 显示/搜索表的记录。
    Update: 修改表中已存在的记录。
    特别的权限:
    ALL: 允许做任何事(和root一样)。
    USAGE: 只允许登录--其它什么也不允许做




    mysql常用命令

    有很多朋友虽然安装好了 MySQL 但却不知如何使用它。在这篇文章中我们就从连接 MySQL、修改密码、增加用户等方面来学习一些 MySQL 的常用命令。

    一、连接MySQL。

    格式: mysql -h主机地址 -u用户名 -p用户密码

    1、例1:连接到本机上的MYSQL。

      首先在打开 DOS 窗口,然后进入目录 mysql\bin,再键入命令mysql -uroot -p,回车后提示你输密码,如果刚安装好 MySQL,超级用户 root 是没有密码的,故直接回车即可进入到 MySQL 中了,MySQL 的提示符是:mysql>

    2、例2:连接到远程主机上的 MySQL。

      假设远程主机的IP为:110.110.110.110,用户名为root,密码为abcd123。则键入以下命令:



    mysql -h110.110.110.110 -uroot -pabcd123



    (注:u与root可以不用加空格,其它也一样)



    3、退出 MySQL 命令: exit (回车)



    二、修改密码。



    格式:mysqladmin -u用户名 -p旧密码 password 新密码



    1、例1:给root加个密码ab12。首先在DOS下进入目录mysqlbin,然后键入以下命令



    mysqladmin -uroot -password ab12



    注:因为开始时root没有密码,所以-p旧密码一项就可以省略了。



    2、例2:再将root的密码改为djg345。



    mysqladmin -uroot -pab12 password djg345



    三、增加新用户。



    (注意:和上面不同,下面的因为是 MySQL 环境中的命令,所以后面都带一个分号作为命令结束符)



    格式:grant select on 数据库.* to 用户名@登录主机 identified by "密码"



    例1、增加一个用户 test1 密码为 abc,让他可以在任何主机上登录,并对所有数据库有查询、插入、修改、删除的权限。首先用以 root 用户连入 MySQL,然后键入以下命令:



    grant select, insert, update, delete on *.* to test1@"%" Identified by "abc";



    但例1增加的用户是十分危险的,你想如某个人知道test1的密码,那么他就可以在internet上的任何一台电脑上登录你的mysql数据库并对你的数据可以为所欲为了,解决办法见例2。



    例2、增加一个用户test2密码为abc,让他只可以在localhost上登录,并可以对数据库 mydb进行查询、插入、修改、删除的操作(localhost指本地主机,即MYSQL数据库所在的那台主机),这样用户即使用知道test2的密码,他也无法从internet上直接访问数据库,只能通过MYSQL主机上的web页来访问了。



    grant select, insert, update,delete on mydb.* to test2@localhost identified by "abc";



      如果你不想test2有密码,可以再打一个命令将密码消掉。



    grant select, insert, update, delete on mydb.* to test2@localhost identified by "";



      在上篇我们讲了登录、增加用户、密码更改等问题。下篇我们来看看MYSQL中有关数据库方面的操作。注意:你必须首先登录到MYSQL中,以下操作都是在MYSQL的提示符下进行的,而且每个命令以分号结束。



    一、操作技巧



    1、如果你打命令时,回车后发现忘记加分号,你无须重打一遍命令,只要打个分号回车就可以了。也就是说你可以把一个完整的命令分成几行来打,完后用分号作结束标志就OK。



    2、你可以使用光标上下键调出以前的命令。但以前我用过的一个MYSQL旧版本不支持。我现在用的是mysql-3.23.27-beta-win。



    二、显示命令



    1、显示数据库列表。



    show databases;



      刚开始时才两个数据库:mysql 和 test。mysql 库很重要它里面有 MySQL 的系统信息,我们改密码和新增用户,实际上就是用这个库进行操作。



    2、显示库中的数据表:



    use mysql; //打开库,学过 FOXBASE 的一定不会陌生吧



    show tables;



    3、显示数据表的结构:



    describe 表名;



    4、建库:



    create database 库名;



    5、建表:



    use 库名;



    create table 表名 (字段设定列表);



    6、删库和删表:



    drop database 库名;



    drop table 表名;



    7、将表中记录清空:



    delete from 表名;



    8、显示表中的记录:



    select * from 表名;



    三、一个建库和建表以及插入数据的实例



    drop database if exists school; //如果存在SCHOOL则删除
    create database school; //建立库SCHOOL
    use school; //打开库SCHOOL
    create table teacher //建立表TEACHER
    (
        id int(3) auto_increment not null primary key,
        name char(10) not null,
        address varchar(50) default '深圳',
        year date
    ); //建表结束



    //以下为插入字段
    insert into teacher values('','glchengang','深圳一中','1976-10-10');
    insert into teacher values('','jack','深圳一中','1975-12-23');



      注:在建表中(1)将 ID 设为长度为 3 的数字字段 int(3) 并让它每个记录自动加一,auto_increment 并不能为空 not null 而且让他成为主字段 primary key(2)将 NAME 设为长度为 10 的字符字段(3)将 ADDRESS 设为长度 50 的字符字段,而且缺省值为深圳。varchar 和char 有什么区别呢,只有等以后的文章再说了。(4)将 YEAR 设为日期字段。



      如果你在 MySQL 提示符键入上面的命令也可以,但不方便调试。你可以将以上命令原样写入一个文本文件中假设为 school.sql,然后复制到 c:\ 下,并在 DOS 状态进入目录 \mysql\bin\ ,然后键入以下命令:



    mysql -uroot -p密码 < c:\school.sql



      如果成功,空出一行无任何显示;如有错误,会有提示。(以上命令已经调试,你只要将//的注释去掉即可使用)。



    四、将文本数据转到数据库中



    1、文本数据应符合的格式:字段数据之间用 tab 键隔开,null 值用 \n 来代替.



    例:



    3 rose 深圳二中 1976-10-10



    4 mike 深圳一中 1975-12-23



    2、数据传入命令



    load data local infile "文件名" into table 表名;



      注意:你最好将文件复制到 \mysql\bin 目录下,并且要先用 use 命令打表所在的库。



    五、备份数据库: (命令在DOS的 \mysql\bin 目录下执行)



    mysqldump --opt school>school.bbb



      注释:将数据库 school 备份到 school.bbb 文件,school.bbb 是一个文本文件,文件名任取,打开看看你会有新发现。
    --------------------------------------------------------------------
    数据库备份操作:



    MySQL 有很多可以导入数据的方法,然而这些只是数据传输中的一半,另外的一般是从MySQL数据库中导出数据。有许多的原因我们需要导出数据。一个重要的原因是用于备份数据库。数据的造价常常是昂贵的,需要谨慎处理它们。经常地备份可以帮助防止宝贵数据地丢失;另外一个原因是,也许您希望导出数据来共享。在这个信息技术不断成长的世界中,共享数据变得越来越常见。

       比方说Macmillan USA维护护着一个将要出版的书籍的大型数据库。这个数据库在许多书店之间共享,这样他们就知道哪些书将会很快出版。医院越来越走向采用无纸病历记录,这样这些病历可以随时跟着你。世界变得越来越小,信息也被共享得越来越多。有很多中导出数据得方法,它们都跟导入数据很相似。因为,毕竟,这些都只是一种透视得方式。从数据库导出的数据就是从另一端导入的数据。这里我们并不讨论其他的数据库各种各样的导出数据的方法,您将学会如何用MySQL来实现数据导出。
      
      使用mysqldump:
      
      (mysqldump命令位于mysql/bin/目录中)

      mysqldump工具很多方面类似相反作用的工具mysqlimport。它们有一些同样的选项。但mysqldump能够做更多的事情。它可以把整个数据库装载到一个单独的文本文件中。这个文件包含有所有重建您的数据库所需要的SQL命令。这个命令取得所有的模式(Schema,后面有解释)并且将其转换成DDL语法(CREATE语句,即数据库定义语句),取得所有的数据,并且从这些数据中创建INSERT语句。这个工具将您的数据库中所有的设计倒转。因为所有的东西都被包含到了一个文本文件中。这个文本文件可以用一个简单的批处理和一个合适SQL语句导回到MySQL中。这个工具令人难以置信地简单而快速。决不会有半点让人头疼地地方。
      
      因此,如果您像装载整个数据库Meet_A_Geek的内容到一个文件中,可以使用下面的命令:

      bin/mysqldump –p Meet_A_Geek > MeetAGeek_Dump_File.txt
      
      这个语句也允许您指定一个表进行dump(备份/导出/装载?)。如果您只是希望把数据库Meet_A_Geek中的表Orders中的整个内容导出到一个文件,可以使用下面的命令:

      bin/mysqldump –p Meet_A_Geek Orders >MeetAGeek_Orders.txt
      
      这个非常的灵活,您甚至可以使用WHERE从句来选择您需要的记录导出到文件中。要达到这样的目的,可以使用类似于下面的命令:

      bin/mysqldump –p –where="Order_ID > 2000" Meet_A_Geek Orders > Special_Dump.txt
      
      mysqldump工具有大量的选项,部分选项如下表:

      选项/Option 作用/Action Performed

      --add-drop-table

      这个选项将会在每一个表的前面加上DROP TABLE IF EXISTS语句,这样可以保证导回MySQL数据库的时候不会出错,因为每次导回的时候,都会首先检查表是否存在,存在就删除

      --add-locks

      这个选项会在INSERT语句中捆上一个LOCK TABLE和UNLOCK TABLE语句。这就防止在这些记录被再次导入数据库时其他用户对表进行的操作
      
      -c or - complete_insert
    这个选项使得mysqldump命令给每一个产生INSERT语句加上列(field)的名字。当把数据导出导另外一个数据库时这个选项很有用。

      --delayed-insert 在INSERT命令中加入DELAY选项

      -F or -flush-logs 使用这个选项,在执行导出之前将会刷新MySQL服务器的log.

      -f or -force 使用这个选项,即使有错误发生,仍然继续导出

      --full 这个选项把附加信息也加到CREATE TABLE的语句中

      -l or -lock-tables 使用这个选项,导出表的时候服务器将会给表加锁。

      -t or -no-create- info

      这个选项使的mysqldump命令不创建CREATE TABLE语句,这个选项在您只需要数据而不需要DDL(数据库定义语句)时很方便。
      
      -d or -no-data 这个选项使的mysqldump命令不创建INSERT语句。

      在您只需要DDL语句时,可以使用这个选项。

      --opt 此选项将打开所有会提高文件导出速度和创造一个可以更快导入的文件的选项。

      -q or -quick 这个选项使得MySQL不会把整个导出的内容读入内存再执行导出,而是在读到的时候就写入导文件中。

      -T path or -tab = path 这个选项将会创建两个文件,一个文件包含DDL语句或者表创建语句,另一个文件包含数据。DDL文件被命名为table_name.sql,数据文件被命名为table_name.txt.路径名是存放这两个文件的目录。目录必须已经存在,并且命令的使用者有对文件的特权。
      
      -w "WHERE Clause" or -where = "Where clause "

      如前面所讲的,您可以使用这一选项来过筛选将要放到 导出文件的数据。
      
      假定您需要为一个表单中要用到的帐号建立一个文件,经理要看今年(2004年)所有的订单(Orders),它们并不对DDL感兴趣,并且需要文件有逗号分隔,因为这样就很容易导入到Excel中。 为了完成这个人物,您可以使用下面的句子:

      bin/mysqldump –p –where "Order_Date >='2000-01-01'"
      –tab = /home/mark –no-create-info –fields-terminated-by=, Meet_A_Geek Orders

      这将会得到您想要的结果。
      
      schema:模式

      The set of statements, expressed in data definition language, that completely describe the structure of a data base.

      一组以数据定义语言来表达的语句集,该语句集完整地描述了数据库的结构。
      
      SELECT INTO OUTFILE :
    如果您觉得mysqldump工具不够酷,就使用SELECT INTO OUTFILE吧, MySQL同样提供一个跟LOAD DATA INFILE命令有相反作用的命令,这就是SELECT INTO OUTFILE 命令,这两个命令有很多的相似之处。首先,它们有所有的选项几乎相同。现在您需要完成前面用mysqldump完成的功能,可以依照下面的步骤进行操作:
      
      1. 确保mysqld进程(服务)已经在运行

      2. cd /usr/local/mysql

      3. bin/mysqladmin ping ;// 如果这个句子通不过,可以用这个:mysqladmin -u root -p ping

      mysqladmin ping用于检测mysqld的状态,is alive说明正在运行,出错则可能需要用户名和密码。

      4. 启动MySQL 监听程序.

      5. bin/mysql –p Meet_A_Geek;// 进入mysql命令行,并且打开数据库Meet_A_Geek,需要输入密码

      6. 在命令行中,输入一下命令:

      SELECT * INTO OUTFILE '/home/mark/Orders.txt'
      FIELDS
      TERMINATED BY = ','
      FROM Orders
      WHERE Order_Date >= '2000-01-01'
      
      在你按了Return(回车)之后,文件就创建了。这个句子就像一个规则的SELECT语句,只是把想屏幕的输出重定向到了文件中。这意味这您可以使用JOIN来实现多表的高级查询。这个特点也可以被用作一个报表产生器。
      
      比方说,您可以组合这一章中讨论的方法来产生一个非常有趣的查询,试试这个:
      
      在mysql目录建立一个名为Report_G.rpt 的文本文件,加入下面的行:

      USE Meet_A_Geek;
      INSERT INTO Customers (Customer_ID, Last_Name, First_Name)
      VALUES (NULL, "Kinnard", "Vicky");
      INSERT INTO Customers (Customer_ID, Last_Name, First_Name)
      VALUES (NULL, "Kinnard", "Steven");
      INSERT INTO Customers (Customer_ID, Last_Name, First_Name)
      VALUES (NULL, "Brown", "Sam");
      SELECT Last_Name INTO OUTFILE '/home/mark/Report.rpt'
      FROM Customers WHERE Customer_ID > 1;

      然后确认 mysql进程在运行,并且您在mysql目录中, 输入下面的命令:

    bin/mysql < Report_G.rpt检查您命名作为输出的文件,这个文件将会包含所有您在Customers表中输入的顾客的姓。 如您所见,您可以使用今天学到的导入/导出(import/export)的方法来帮助得到报表。
    -----------------------------------------------------------
  • 今天开始从事软件测试工作

    2007-09-16 15:27:38

      今天开始从事公司的软件测试工作。
Open Toolbar