tag 标签: python自动化测试

相关帖子
相关博文
  • 热度 6
    2022-6-5 20:45
    1666 次阅读|
    0 个评论
    随着软件开发在造车行业中占有越来越重要的地位,敏捷开发的思想在造车领域中也逐渐地被重视起来,随之而来的是整车厂对自动化测试需求越来越强烈。本文结合北汇信息在自动化测试方面的丰富经验,简单介绍一下实施自动化测试可能需要具备的技能及具体实践流程。 自动化测试城门 -Python 要实现完全的自动化测试,我们首先要做的是先实现半自动化测试,即编写自动化测试脚本。俗话说Life is short,I use Python,Python作为一种简单易上手的高级编程语言,凭借其“无所不包”的库,成为测试脚本开发的不二之选。这里简单介绍一下,测试脚本开发常用的一些Python标准库。 城门士卒-os库 在编写测试脚本时,不可避免地会遇到对文件路径的获取及编辑,os库里的path函数可以方便地实现这些操作,如绝对路径获取os.path.abspath()、路径拼接os.path.join()、路径存在判断os.path.exist()等;如果你需要在Python中运行测试工具提供的命令,那么os库的system函数或popen函数可以让你方便地调用cmd(Windows)或shell(Linux)。 城门士卒-sys库 如果你所编写的测试脚本有跨平台运行的需求,那么你可以通过sys库的platform函数获取脚本的运行环境。根据运行环境的不同,编写不同的批处理命令;sys库中的argv函数,还可以为你的测试脚本提供简单的命令行接口,当你的脚本需要接收外部传递的参数时,你可以通过sys.argv .attributes.getNamedItem( "lang" ).nodeValue 获取第一个标签为title的元素的文本信息的代码如下: root.getElementsByTagName( "title" ) .firstChild.data 瓮城参将——XML修改 XML元素的属性和文本内容修改很简单,在上小节中获取对应的元素信息后,直接对其进行赋值即可。但是,修改后的信息保存在XML对象中。要完成对实际XML文件的修改,我们还需要用XML对象中的内容覆盖原有的XML文件,这一步存在很多棘手的问题。 在XML文件中,为了避免元素文本内容中存在的特殊字符引起解析器错误,在文本内容中引入 实体引用 来替代可能导致错误的字符,如回车、双引号 " 、单引号 ' 。如果使用python的xml.dom.minidom库解析并使用writexml输出XML文件,该库会将这些 实体引用 转义为其实际字符进行保存。如果不对XML对象中的内容进行处理,导出的XML文件将会存在很多错误。 为了避免这个情况的出现,我们需要使用之前小节介绍的正则表达式将这些字符再替换为其实体引用。这个过程需要我们能熟练使用正则表达式进行文本查找与替换。 除了XML文件中的实体引用外,如果XML文件中存在中文字符,那么还有一个需要注意的事情:不要使用with open as的方式读写XML文件,要使用open指定文件的编码为'utf-8’ 的方式,对XML文件进行写入。如下所示: f = open ( self .JenkinsJobXMLPath , 'w' , encoding = "utf-8" ) dom.writexml(f , indent = '' , addindent = ' \t ' , newl = '' , encoding = 'utf-8' ) f.close() 小结 上述两个问题是修改XML文件时普遍会遇到的问题。解决了这两个问题,我们基本上就可以完美实现XML文件的修改了。此时,我们就可以编写自动化程度更高的测试脚本,然而我们依然无法实现完全的自动化测试,因为我们仍然需要手动地去执行测试脚本。那么,我们该如何实现测试脚本的自动执行呢?这就需要我们打通自动化测试的最后一个关卡,Jenkins。 自动化测试总兵—— Jenkins Jenkins 是一个 开源、免费 的可扩展持续集成引擎,主要用于: • 持续、自动地构建/测试软件项目; • 监控一些定时执行的任务。 为了实现测试脚本的自动化运行,我们需要配置JenkinsJob,使Jenkins在设置的触发条件满足时,自动搭建测试脚本的运行环境,然后执行测试脚本,最后将测试结果发送给相关人员。因此我们需要了解Jenkins的源码管理、构建触发器、构建及邮件通知等设置。 总兵的连招1——源码管理 Jenkins服务器最基本的作用是监视版本控制器,当版本库有新的更改时,检出版本库中的文件,或者,你可以选择只是定期检出版本库中最新的文件。无论哪种方式,Jenkins与版本控制软件的集成是必不可少的。 Jenkins开箱即用式支持Git、CVS和SVN,还通过插件与大量其他版本控制工具进行集成,如ClearCase、Perforce、PVCS等等。 不同的版本控制软件在Jenkins端的需要的配置并不相同,有的甚至差异很大。但是只要你熟悉你所使用的版本控制软件,那么在Jenkins端,就可以很容易地对版本库进行配置。 以SVN为例,为了从SVN仓库中获取源码,我们需要提供相应SVN版本库的URL,在完成URL输入后,Jenkins会检查URL的有效性,如果所提供的URL要求身份认证,Jenkins将会自动提示选择相应的凭据以验证账号信息,如下图所示。 默认情况下,Jenkins会将给定的代码库中的文件检出到Jenkins Job的Workspace中。如果你需要将代码库检出到指定的目录中,你可以在 Local module directory 中输入你想要的目录名或相对Workspace的路径。 如果你需要从多个SVN版本库中获取文件,可以点击“Add module ...”按钮,来添加别的版本库。 总兵的连招2——构建触发器 常用的构建触发器有 周期性构建 和 SCM轮询构建 ,两者都是使用相同corn风格语法进行设置,如下图所示。 我们只需要了解corn风格的语法,就可以方便地进行构建触发器的设置。corn风格的语法包含五个由空格分隔的字段: MINUTE HOUR DOM MONTH DOW 每个字段使用下面的值: MINUTE 小时内的分钟数(0-59) HOUR 一天的小时数(0-23) DOM 本月的天数(1-31) MONTH 月份(1-12) DOW 本周的一天(0-7),其中0和7都是星期日。 要为一个字段指定多个值,可以使用以下操作符: ▲“*”代表一个字段的所有可能的值。如,“* * ** *”表示周期为一分钟; ▲使用“M-N”定义范围。如,在DOW中“1-5”表示周一到周五; ▲使用“/”定义范围间隔时间。如,MINUTE字段“*/5”表示每5分钟; ▲ 逗号分隔的列表表示有效值。如,MINUTE字段“15,45”表示在每小时的第15和第45分钟运行。 总兵的连招3——构建 在完成了之前的配置后,Jenkins应该知道 在何时从何处 获取测试工程及源码。现在我们需要做的事情是,告诉Jenkins在获取测试工程和源码后该如何做。一般情况下,我们会将之前编写的测试脚本放在测试工程的版本库中,或者从专门的测试脚本库中检出到Jenkins Job的Workspace中,因此我们在这里只需要执行编写好的测试脚本即可。 执行脚本的方式可以根据具体脚本的运行环境,选择执行Shell或Windows批处理命令。因此我们需要简单地了解Shell或Windows的常用批处理命令。为了避免编写复杂的批处理命令,我们应尽量把工作放在测试脚本中完成。本文以如下图所示的简单的Windows批处理为例,简单介绍一下构建步骤的编写。 在上图中,有两行命令: 第一行的作用是将目录由初始的Workspace目录切换到Workspace下的Script目录; 第二行的作用是运行Script目录中的测试脚本Script.py,并为该脚本传递一个参数,该参数为Jenkins的环境变量JOB_NAME,即当前Jenkins Job的名称。 这样就完成了对测试脚本的调用。 总兵的连招4——邮件通知 自动化测试的一个重要环节,就是将测试结果通知到相关人员,如开发\测试人员,或项目管理人员等。Jenkins对电子邮件提供了开箱即用的支持,我们可以在 构建后处理 中勾选 E-mail Notification ,如下图所示。然后输入需要通知的人员邮箱,即可使Jenkins在构建完成后,向指定的人员发送一封友好的电子邮件。 如果你想对邮件内容进行高度定制,那么E-mailNotification就无法满足需求,我们需要安装可编辑的电子邮件插件Editable EmailNotification,来实现电子邮件的定制化工作。 在Editable EmailNotification中,我们可以用HTML编写电子邮件的内容,并引用Jenkins的环境变量,这样我们就可以在邮件中描述当前Jenkins Job的测试执行概况,让收件人快速地了解当前的测试状态。但是这要求我们对HTML和Jenkins环境变量都有比较深的了解。 有些情况下,我们需要在邮件中执行一些数据提取等复杂工作,比如将控制台输出中的一些数据在邮件中进行展示,这时我们需要借助email-ext-plugin插件提供的Groovy接口,用Groovy编写邮件内容。 总之,Jenkins的邮件通知功能非常强大,我们可以在自动化测试的工作中不断进行探索。 小结 本节简单介绍了Jenkins的传统表单类型的Freestyle Job,然而目前Jenkins的发展方向是 Pipeline Job,Jenkins将Pipeline作为优先开发项目。这就意味着Pipeline在应用程序中是作为实体被设计和支持的,而不是通过在Jenkins中连接一堆任务而形成流水线。Pipeline类型的Job可以通过编程实现,可以实现更复杂构建逻辑和工作流,更重要的是在Pipeline中有专门的用于流水线编程的结构化DSL,其可以在工作空间中轻松地实现文件共享功能。同时Pipeline具有全新的Jenkins可视化界面 ——Blue Ocean,其为Pipeline的每个阶段添加了图形化的展示,如下图所示。 因此我们在熟悉了表单类型的 Freestyle Job后,可以尝试将其转换为Pipeline的Job,当然目前并非所有的Jenkins插件都支持Pipeline,有些老旧的插件还无法支持Pipeline,我们需要根据实际的工作情况进行Jenkins工程类型的选择。 攻城总结 古人云:知所不豫,行且通焉。虽然通过本文,我们全面地了解了自动化测试的流程,但是只有在自动化测试的实践中不断探索,我们才能真正窥得自动化测试的全貌。北汇信息作为专业的自动化测试服务供应商,也可以为客户提供优质全面的自动化测试服务。 、 、 、 。每个子元素都包含一个 文本内容 ,但只有子元素title和元素book拥有 属性 。 我们在解析XML时,一般需要获取的就是元素的 属性值 以及元素的 文本内容。 以下我们就简单介绍一下,如何通过python获取元素的属性值及文本内容。 Python 的XML库提供了一个通过标签名称获取元素的函数getElementsByTagName(),该函数返回的是一个包含元素对象的list,通过调用元素对象的attributes方法,我们就可以方便地获取元素的属性值。如,我们可以使用如下命令获取XML文件中第一个标签为title的lang属性值: root.getElementsByTagName("title") .attributes.getNamedItem( "lang" ).nodeValue 获取第一个标签为title的元素的文本信息的代码如下: root.getElementsByTagName( "title" ) .firstChild.data 瓮城参将——XML修改 XML元素的属性和文本内容修改很简单,在上小节中获取对应的元素信息后,直接对其进行赋值即可。但是,修改后的信息保存在XML对象中。要完成对实际XML文件的修改,我们还需要用XML对象中的内容覆盖原有的XML文件,这一步存在很多棘手的问题。 在XML文件中,为了避免元素文本内容中存在的特殊字符引起解析器错误,在文本内容中引入 实体引用 来替代可能导致错误的字符,如回车、双引号 " 、单引号 ' 。如果使用python的xml.dom.minidom库解析并使用writexml输出XML文件,该库会将这些 实体引用 转义为其实际字符进行保存。如果不对XML对象中的内容进行处理,导出的XML文件将会存在很多错误。 为了避免这个情况的出现,我们需要使用之前小节介绍的正则表达式将这些字符再替换为其实体引用。这个过程需要我们能熟练使用正则表达式进行文本查找与替换。 除了XML文件中的实体引用外,如果XML文件中存在中文字符,那么还有一个需要注意的事情:不要使用with open as的方式读写XML文件,要使用open指定文件的编码为'utf-8’ 的方式,对XML文件进行写入。如下所示: f = open ( self .JenkinsJobXMLPath , 'w' , encoding = "utf-8" ) dom.writexml(f , indent = '' , addindent = ' \t ' , newl = '' , encoding = 'utf-8' ) f.close() 小结 上述两个问题是修改XML文件时普遍会遇到的问题。解决了这两个问题,我们基本上就可以完美实现XML文件的修改了。此时,我们就可以编写自动化程度更高的测试脚本,然而我们依然无法实现完全的自动化测试,因为我们仍然需要手动地去执行测试脚本。那么,我们该如何实现测试脚本的自动执行呢?这就需要我们打通自动化测试的最后一个关卡,Jenkins。 自动化测试总兵—— Jenkins Jenkins 是一个 开源、免费 的可扩展持续集成引擎,主要用于: • 持续、自动地构建/测试软件项目; • 监控一些定时执行的任务。 为了实现测试脚本的自动化运行,我们需要配置JenkinsJob,使Jenkins在设置的触发条件满足时,自动搭建测试脚本的运行环境,然后执行测试脚本,最后将测试结果发送给相关人员。因此我们需要了解Jenkins的源码管理、构建触发器、构建及邮件通知等设置。 总兵的连招1——源码管理 Jenkins服务器最基本的作用是监视版本控制器,当版本库有新的更改时,检出版本库中的文件,或者,你可以选择只是定期检出版本库中最新的文件。无论哪种方式,Jenkins与版本控制软件的集成是必不可少的。 Jenkins开箱即用式支持Git、CVS和SVN,还通过插件与大量其他版本控制工具进行集成,如ClearCase、Perforce、PVCS等等。 不同的版本控制软件在Jenkins端的需要的配置并不相同,有的甚至差异很大。但是只要你熟悉你所使用的版本控制软件,那么在Jenkins端,就可以很容易地对版本库进行配置。 以SVN为例,为了从SVN仓库中获取源码,我们需要提供相应SVN版本库的URL,在完成URL输入后,Jenkins会检查URL的有效性,如果所提供的URL要求身份认证,Jenkins将会自动提示选择相应的凭据以验证账号信息,如下图所示。 默认情况下,Jenkins会将给定的代码库中的文件检出到Jenkins Job的Workspace中。如果你需要将代码库检出到指定的目录中,你可以在 Local module directory 中输入你想要的目录名或相对Workspace的路径。 如果你需要从多个SVN版本库中获取文件,可以点击“Add module ...”按钮,来添加别的版本库。 总兵的连招2——构建触发器 常用的构建触发器有 周期性构建 和 SCM轮询构建 ,两者都是使用相同corn风格语法进行设置,如下图所示。 我们只需要了解corn风格的语法,就可以方便地进行构建触发器的设置。corn风格的语法包含五个由空格分隔的字段: MINUTE HOUR DOM MONTH DOW 每个字段使用下面的值: MINUTE 小时内的分钟数(0-59) HOUR 一天的小时数(0-23) DOM 本月的天数(1-31) MONTH 月份(1-12) DOW 本周的一天(0-7),其中0和7都是星期日。 要为一个字段指定多个值,可以使用以下操作符: ▲“*”代表一个字段的所有可能的值。如,“* * ** *”表示周期为一分钟; ▲使用“M-N”定义范围。如,在DOW中“1-5”表示周一到周五; ▲使用“/”定义范围间隔时间。如,MINUTE字段“*/5”表示每5分钟; ▲ 逗号分隔的列表表示有效值。如,MINUTE字段“15,45”表示在每小时的第15和第45分钟运行。 总兵的连招3——构建 在完成了之前的配置后,Jenkins应该知道 在何时从何处 获取测试工程及源码。现在我们需要做的事情是,告诉Jenkins在获取测试工程和源码后该如何做。一般情况下,我们会将之前编写的测试脚本放在测试工程的版本库中,或者从专门的测试脚本库中检出到Jenkins Job的Workspace中,因此我们在这里只需要执行编写好的测试脚本即可。 执行脚本的方式可以根据具体脚本的运行环境,选择执行Shell或Windows批处理命令。因此我们需要简单地了解Shell或Windows的常用批处理命令。为了避免编写复杂的批处理命令,我们应尽量把工作放在测试脚本中完成。本文以如下图所示的简单的Windows批处理为例,简单介绍一下构建步骤的编写。 在上图中,有两行命令: 第一行的作用是将目录由初始的Workspace目录切换到Workspace下的Script目录; 第二行的作用是运行Script目录中的测试脚本Script.py,并为该脚本传递一个参数,该参数为Jenkins的环境变量JOB_NAME,即当前Jenkins Job的名称。 这样就完成了对测试脚本的调用。 总兵的连招4——邮件通知 自动化测试的一个重要环节,就是将测试结果通知到相关人员,如开发\测试人员,或项目管理人员等。Jenkins对电子邮件提供了开箱即用的支持,我们可以在 构建后处理 中勾选 E-mail Notification ,如下图所示。然后输入需要通知的人员邮箱,即可使Jenkins在构建完成后,向指定的人员发送一封友好的电子邮件。 如果你想对邮件内容进行高度定制,那么E-mailNotification就无法满足需求,我们需要安装可编辑的电子邮件插件Editable EmailNotification,来实现电子邮件的定制化工作。 在Editable EmailNotification中,我们可以用HTML编写电子邮件的内容,并引用Jenkins的环境变量,这样我们就可以在邮件中描述当前Jenkins Job的测试执行概况,让收件人快速地了解当前的测试状态。但是这要求我们对HTML和Jenkins环境变量都有比较深的了解。 有些情况下,我们需要在邮件中执行一些数据提取等复杂工作,比如将控制台输出中的一些数据在邮件中进行展示,这时我们需要借助email-ext-plugin插件提供的Groovy接口,用Groovy编写邮件内容。 总之,Jenkins的邮件通知功能非常强大,我们可以在自动化测试的工作中不断进行探索。 小结 本节简单介绍了Jenkins的传统表单类型的Freestyle Job,然而目前Jenkins的发展方向是 Pipeline Job,Jenkins将Pipeline作为优先开发项目。这就意味着Pipeline在应用程序中是作为实体被设计和支持的,而不是通过在Jenkins中连接一堆任务而形成流水线。Pipeline类型的Job可以通过编程实现,可以实现更复杂构建逻辑和工作流,更重要的是在Pipeline中有专门的用于流水线编程的结构化DSL,其可以在工作空间中轻松地实现文件共享功能。同时Pipeline具有全新的Jenkins可视化界面 ——Blue Ocean,其为Pipeline的每个阶段添加了图形化的展示,如下图所示。 因此我们在熟悉了表单类型的 Freestyle Job后,可以尝试将其转换为Pipeline的Job,当然目前并非所有的Jenkins插件都支持Pipeline,有些老旧的插件还无法支持Pipeline,我们需要根据实际的工作情况进行Jenkins工程类型的选择。 攻城总结 古人云:知所不豫,行且通焉。虽然通过本文,我们全面地了解了自动化测试的流程,但是只有在自动化测试的实践中不断探索,我们才能真正窥得自动化测试的全貌。北汇信息作为专业的自动化测试服务供应商,也可以为客户提供优质全面的自动化测试服务。