perl 用 XML::DOM 解析 Freeplane.mm文件,生成测试用例.csv文件

Perl 官网 www.cpan.org
从 https://strawberryperl.com/  下载网速太慢了
建议从 https://download.youkuaiyun.com/download/qq_36286161/87892419
下载 strawberry-perl-5.32.1.1-64bit.zip  约105MB
解压后安装.msi,装完后有520MB+,建议安装在D:盘。

运行 cmd
cpan
install XML::DOM

在云计算中,解析XML元素和属性是一种常见的操作,因为XML是一种常见的数据交换格式,可以用来表示各种不同的数据结构和信息。Perl 是一种过去流行的脚本语言,可以用来处理各种文本数据,包括XML数据。

在Perl 中,可以使用各种模块和函数来解析 XML元素和属性。其中,常用的模块是  XML::DOM,它提供了一组完整的XML解析和处理函数,可以方便地解析XML文档中的元素和属性。

例如,下面是一个使用 XML::DOM 模块 解析 XML元素和属性 的示例代码:

先编写一个测试程序 test_xml_dom.pl  如下

#!/usr/bin/perl
use 5.010;
use strict;
use warnings;
use utf8;
use XML::DOM;
use Data::Dumper;

if ($#ARGV != 0){
    die "You must specify a file.xml to parse";
}
my $file = shift @ARGV;

my $parser = new XML::DOM::Parser;
my $doc = $parser->parsefile($file)
         or die "cannot read file.xml\n";

my $f2 = $file .'.txt';
# 写入文件
open(my $fw, '>:encoding(UTF-8)', $f2) or die "cannot open file '$f2' $!";

# print all TEXT attributes of all node elements
my $nodes = $doc->getElementsByTagName('node');
my $n = $nodes->getLength;

for (my $i=0; $i < $n; $i++)
{
    my $node = $nodes->item ($i);
    my $TEXT = $node->getAttributeNode('TEXT');
    print $fw $TEXT->getValue ."\n";
}
close($fw);
# Avoid memory leaks - for garbage collection
$doc->dispose;

运行  perl test_xml_dom.pl your_test.xml 

再编写  xml_dom_parser.pl  如下

#!/usr/bin/perl
use 5.010;
use strict;
use warnings;
use utf8;
use XML::DOM;

# 解析 Freeplane.mm文件,生成测试用例.csv文件
#  xt: 应用系统名的英文或拼音缩写
# zd?: 字段?的拼音缩写
# zd1: 模块名
# zd2: 功能名
# zd3: 正向 或 反向
# zd4: 测试要点
# zd5: 执行步骤
# zd6: 预期结果
# csylms:测试用例描述

if ($#ARGV != 0){
    die "You must specify a file.xml to parse";
}
my $file = shift @ARGV;

my $parser = new XML::DOM::Parser;
my $doc = $parser->parsefile($file)
         or die "cannot read file.xml\n";

my $f2 = $file .'.csv';
# 写入文件
open(my $fw, '>:encoding(UTF-8)', $f2) or die "cannot open file '$f2' $!";
print $fw "应用系统名,模块名,测试用例描述,正反向,执行步骤,预期结果\n";

# 要检查一个字符串是否以另一个字符串开始,可使用字符串比较:
sub startsWith {  
    my ($str, $prefix) = @_;  
    return substr($str,0, length($prefix)) eq $prefix;
} 

# 获取根节点  
my $root = $doc->getFirstChild;
my $nodes = $root->getElementsByTagName('node');
my $node = $nodes->item(0);
say ref($node);
my $xt = $node->getAttributeNode('TEXT')->getValue;
my ($zd1,$zd2,$zd3,$zd4,$zd5,$zd6,$txt,$csylms);
$zd5 =''; $zd6 ='';
foreach my $node1 ($node->getChildNodes){
if($node1->getNodeType == ELEMENT_NODE and $node1->getTagName eq 'node'){
  my $t1 = $node1->getAttributeNode('TEXT');
  if ($t1){ $zd1 = $t1->getValue;}
  foreach my $node2 ($node1->getChildNodes){
  if($node2->getNodeType == ELEMENT_NODE and $node2->getTagName eq 'node'){
    my $t2 = $node2->getAttributeNode('TEXT');
    if ($t2){ $zd2 = $t2->getValue;}
    foreach my $node3 ($node2->getChildNodes){
    if($node3->getNodeType == ELEMENT_NODE and $node3->getTagName eq 'node'){
       my $t3 = $node3->getAttributeNode('TEXT');
       if ($t3){ $zd3 = $t3->getValue;}
       foreach my $node4 ($node3->getChildNodes){
       if($node4->getNodeType == ELEMENT_NODE and $node4->getTagName eq 'node'){
         my $t4 = $node4->getAttributeNode('TEXT');
         if ($t4){ $zd4 = $t4->getValue;}
         foreach my $node5 ($node4->getChildNodes){
         if($node5->getNodeType == ELEMENT_NODE and $node5->getTagName eq 'node'){
           my $t5 = $node5->getAttributeNode('TEXT');
           if ($t5){ $txt = $t5->getValue;
             if (startsWith($txt, '步骤:')){
               $zd5 = substr($txt, 3);
             } elsif (startsWith($txt, '预期结果:')){
               $zd6 = substr($txt, 5);
               $csylms = $zd2 .'-'. $zd4; # 测试用例描述
               print $fw "$xt,$zd1,$csylms,$zd3,$zd5,$zd6\n";
             } else {
               $zd5 =''; $zd6 ='';
             }
           }
        }}
      }}
    }}
  }}
}}
close($fw);
# Avoid memory leaks - for garbage collection
$doc->dispose;

运行 perl xml_dom_parser.pl your_test.mm

应用系统名,模块名,测试用例描述,正反向,执行步骤,预期结果
应用系统,模块1,功能11-测试要点111,正向,1.步骤,1.结果
应用系统,模块1,功能11-测试要点112,正向,2.步骤,2.结果
应用系统,模块1,功能11-要点111,反向,3.步骤,3.结果
应用系统,模块1,功能11-要点112,反向,4.步骤,4.结果
应用系统,模块2,功能21-测试要点211,正向,5.步骤,5.结果
应用系统,模块2,功能21-测试要点212,正向,6.步骤,6.结果
应用系统,模块2,功能21-要点211,反向,7.步骤,7.结果
应用系统,模块2,功能21-要点212,反向,8.步骤,8.结果

参阅:XML::DOM - A perl module for building DOM Level 1 compliant document structures - metacpan.org

实验六 性能与自动化测试 一、实验目的 (1)掌握selenium测试工具的基本原理和方法; (2)掌握selenium IDE测试; (3)掌握性能测试的基本原理和方法; (4)掌握jmeter测试工具使用方法 (5)掌握性能测试的分析方法 二、实验环境 主流PC机一套,windows操作系统、WEB项目、selenium 、tomcat 、jmeter; 目标测试系统 : 1.站长工具网站(http://tool.chinaz.com/) 2.DBshop电子商务网站http://150.158.110.4/ test01/123456 3.湖科大官网:http://www.hnust.edu.cn/ 4.https://cn.bing.com/ 三、实验内容 内容1 :功能自动化测试 1、制定功能测试计划和内容,编写功能测试用例 2、安装selenium IDE; 3、利用selenium IDE,根据功能测试用例,录制功能测试脚本,进行保存和回放; 4、学会常用命令的使用。 实验背景: Selenium是一个用于Web应用程序测试的工具。Selenium 测试直接运行在浏览器中,就像真正的用户在操作一样。支持的浏览器包括IE,Mozilla和Firefox等。这个工具的主要功能包括:测试与浏览器的 兼容性--测试你的应用程序看是否能够很好得工作在不同浏览器和操作系统之上。测试系统功能--创建衰退测试检验软件功能和用户需求。 Selenium 已经演化成了几个行的子项目,它们分别是:Selenium Core、SeleniumIDE、Selenium Remote Control 和Selenium onRails。 Selenium Core 是测试工具的核心,也是其他子项目的依托。它是一个内嵌于浏览器中的JavaScript 和iframe 的自动化测试引擎。其最近一个发布版本是在2007 年9 月发布的0.8.3。Selenium IDE 是一个针对Selenium 测试的集成开发环境。它是作为Firefox 的扩展来实现的,允许录制、编辑和调试Selenium 测试。目前的最新版本是0.8.7。 Selenium Remote Control 提供了一个Selenium Server,它以Ajax 方式来控制浏览器。你可以通过普通的HTTP 请求与Selenium Server交互,这使得你能够用许多主流编程语言(比如Java、.NET、Perl、Python、Ruby)来编写自动化的Web 应用UI 测试。Selenium Remote Control目前的最新版本是2007 年9 月发布的0.9.2。 Selenium on Rails 是一个专门用于为测试Rails 应用程序提供便利的插件。它原来是由Jonas Bengtsson 在其个人网站上发布的,2006年8 月刚刚搬迁到Selenium 的官方主页。 实验步骤: 要求用尽可能少的测试用例检测出尽可能多的软件缺陷: (1)功能需求分析。选择目标网站,如站长工具网站(http://tool.chinaz.com/)根据软件需求,选择主要功能进行测试,功能在10个左右; (2)录制测试脚本。根据功能测试用例,录制测试脚本; 启动firefox,点击“工具->selenium IDE”,启动selenium IDE插件,进入录制状态 在firefox地址栏中输入URL,进行操作,selenium IDE自动记录用户的操作步骤 操作完成后,点击selenium IDE插件中的录制按钮,停止录制。 (3)学会selenium常用命令的使用。 一、Action:用于操作一般应用程序 1、浏览器的操作 (1)open(URL):打开指定的URL (2)goBack():相当于浏览器上的后退键 (3)refresh():相当于浏览器上的刷新按钮 (4)windowsMaximize():用于将当前选中的浏览器窗口最大化 (5)close():相当于浏览器的关闭按钮 (6)echo(message):将指定信息打印出来。一般用于调试 2、界面元素的基本操作 (1)type(locatoe,value):用于在input类型的元素中输入值,也可用于给下拉列表框、复选框赋值。 (2)click(locator):单击链接、复选框或单选按钮。 (3)doubleClick(locator):双击。如果双击动作会导致页面重新加载,最好在后面添加wautForPageToLoad命令。 (4)select(selectLocator,optionLocator):该选项用于在下拉列表框中选择指定选项。 (5)check(locator):勾选复选框或单选框。 (6)uncheck(locator):取消勾选。 (7)focus(locator):将焦点转移到指定的元素上。 二、Accessor:用于检查应用程序的状态,将结果存储在变量中 (1)store(expression,variableName):将指定的值存储在变量中。 (2)storeTitle(variableName):用于存放网页标题。 (3)storeLocation(variableName):用于存储当前网页的URL。 (4)storeValue(locator,variableName):用于存储input元素所存放的值。 三、Assertion:与Accessor相似,主要用于验证某个命题是否为真,预期结果与实际结果进行比较的过程。 分为assert(断言),verify(验证),waitFor(等待)三类命令; 这三类命令有分为五种验证手段:Title(获取页面标题),Value(获取元素的值),Text(获取元素的文本内容),Table(获取元素的标签),ElementPresent(获取当前元素)。 区别:如果assert失败,测试就会中断;而verify失败时,失败将会记录下来,但测试依然会继续执行;而waitFor用于等待,直到等待的条件为真,条件为真,那么测试就会通过。 撰写实验一份报告包括实验内容(实验原理、运用的理论知识、算法、程序、步骤和方法)和实验结果与分析
05-14
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值