zoukankan      html  css  js  c++  java
  • XML、Linq、序列化、反射、XSLT在测试报告统计工具中的应用 Anny

    客户要求对XML格式的测试结果进行统计,并发送出特定格式的邮件。

    1. 测试结果有两种文件,一种是以xml为后缀的xml格式文件,一种是VS里跑测试用例产生的以trx为后缀的xml格式文件。

    2. 每个文件里包含多个测试用例,每个测试用例有对应的Owner和归属类别Area。

    3. 最后输出的报告格式如下:

    Area

    File

    Owner

    Pass

    Fail

    Invalid

    Total

    A

       

    4

    0

    0

    4

     

    a.xml

    S

    1

    0

    0

    1

     

    b.xml

    S;K;

    3

    0

    0

    3

    B

       

    1

    0

    0

    1

     

    b.xml

    K;

    1

    0

    0

    1

    C

       

    1

    2

    0

    3

     

    2010-11-15 23_24_10.trx

    K;

    1

    0

    0

    1

     

    2010-11-16 19_55_45.trx

    K;

    0

    1

    0

    1

     

    2010-11-03 20_29_01.trx

    K;

    0

    1

    0

    1

    D

       

    1

    0

    0

    1

     

    2010-11-16 19_55_45.trx

    L;

    1

    0

    0

    1

    Overall

    -

    -

    7

    2

    0

    9

    整体思路是根据xml格式的测试结果产生xsd文件,进而使用xsd2code工具产生类文件,这样就可以使用Linq遍历对象,抽取统计结果,然后将其存储在报告对象中,通过序列化,产生测试报告的xml文件,在发送邮件时,结合xlst,输出给定格式的测试报告。

    在实现过程中,对于不太熟悉这些技术的初学者,会碰到一些问题,下面就简单说一下。

    1. 根据xml产生xsd文件

    对于简单的xml文件,我们完全可以手写一个对应的xsd,但是有自动生成xsd的方法,大家肯定更愿意使用。

    在VS中打开xml格式的文件,在菜单栏可以出现“XML”,点击“XML”,然后在弹出的快捷菜单中点击“Create Schema”,将创建好的xsd文件保存下来就可以了,很方便。

    2. 使用xsd2code.exe将按xsd文件生成cs类文件

    xsd2code是VS的一个插件,首先到http://xsd2code.codeplex.com/官方网站下载xsd2code安装包,然后安装到工作机上就可以了,安装成功后,在项目里,右击xsd文件,就可以看到“Run Xsd2Code generation”。

    点击“Run Xsd2Code generation”,会弹出对话框,为了正常进行序列化和反序列化,我们需要对默认的值进行重新设置。

    展开“PropertyParms”,将GenerateShouldSerializeProperty的值设为True;

    展开“Serialization”,将Enabled的值设为True;将GenerateXmlAttribute得值设为True;

    最后就可以点击“generate”了。接下来,我们就可以使用借助xsd文件,进行xml和类对象之间的序列化和反序列化喽。

    3. 对于非标准的xml文件在反序列化时会失败,比如stack overflow

    在实现中,发现xml文件格式并不规范,属于那种嵌套的格式(A嵌套B,B又嵌套A,且嵌套层次不确定),如下:

    <A>

      <B>

        <A>

          <B>

            ...

          </B>

        </A>  

      </B>

    </A>

    这样的xml产生的xsd需要手动调整,可以用引用的形式书写:

    <xs:element name="B">
        <xs:complexType>
          <xs:sequence>
            <xs:element ref="A" />
          </xs:sequence>
        </xs:complexType>
      </xs:element>
      <xs:element name="A">
        <xs:complexType>
          <xs:sequence>
            <xs:element ref="B">         
            </xs:element>
          </xs:sequence>
        </xs:complexType>
      </xs:element>

    由这个xsd产生的cs类文件的构造函数会相互构造导致堆栈溢出。

    对于这种情况,不建议产生cs类文件,而是直接通过Linq去访问xml文件。

    4. 对于trx文件的处理,可以自动产生cs类文件,但是需要获取testcase的TestArea自定义Attribute,需要从cs类文件中得到对应的testcase的dll文件,加载程序集,进而使用反射的方式得到该测试方法对应的Attribute。

    加载程序集时,注意使用Assembly adaptorAssembly = Assembly.LoadFrom(fullpath); 而不是Assembly adaptorAssembly = Assembly.LoadFile(fullpath);

    Type type = adaptorAssembly.GetType(className,true,true);

    MethodInfo method = type.GetMethod(methodName);                    
    foreach (object attribute in method.GetCustomAttributes(true))

    {
          if (attribute is TestAreaAttribute)
          {
               Console.WriteLine("Method=[{0}], Area=[{1}]", method.Name, ((TestAreaAttribute)attribute).AreaPath);
               break;
           }
    }

    5. 如果程序集是从远程共享路径加载的,则可能会遇到权限不足的问题 

    Could not load file or assembly 'XXXXX, Version=1.0.1.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies. Failed to grant minimum permission requests. (Exception from HRESULT: 0x80131417)

    解决方法是使用UI或者命令行的形式赋予共享路径完全信任。

    UI(.NET Framework Configuration Tool):限于.net framework 较低版本1.0,2.0 对于3.0,3.5,4.0之后的版本则取消了UI操作;

    command line:注意区分系统是32位还是64位,这样可以确定是在C:\Windows\Microsoft.NET\Framework64\...还是C:\Windows\Microsoft.NET\Framework\...里去运行caspol.exe工具。

    C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\caspol.exe -m -ag 1 -url "file:////\\fs\share\*" FullTrust -exclusive on

    C:\WINDOWS\Microsoft.NET\Framework64\v2.0.50727\caspol.exe -m -ag 1 -url "file:////\\fs\share\*" FullTrust -exclusive on

    6. 按既定格式设计要输出的xml和xlst

    注意,xslt仅仅是更好的将数据显示出来,核心的东西还是取决于xml的内容,对于一个给定的xml,不要试图用xslt显示一个复杂的格式,这个一般不容易做到,最好的方法是调整xml的结构,比如对于这个测试报告的格式,我们产生的xml应该是下面的样子,才方便用xslt输出符合要求的格式。

    <Report xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
      <Item>
        <AreaInfo>
          <Area>
            <Name>A</Name>
            <Pass>4</Pass>
            <Fail>0</Fail>
            <Invalid>0</Invalid>
            <Total>4</Total>
          </Area>
          <FileInfos>
            <FileInfo>
              <File>a.xml</File>
              <Owner>S;</Owner>
              <Pass>1</Pass>
              <Fail>0</Fail>
              <Invalid>0</Invalid>
              <Total>1</Total>
            </FileInfo>
            <FileInfo>
              ...
            </FileInfo>
          </FileInfos>
        </AreaInfo>
        <AreaInfo>
          <Area>
            ...
          </Area>
          <FileInfos>
            <FileInfo>
              ...
            </FileInfo>
          </FileInfos>
        </AreaInfo>
      </Item>
      <OverallCountsField>
        <successCount>7</successCount>
        <errorCount>2</errorCount>
        <invalidcaseCount>0</invalidcaseCount>
        <totalCount>9</totalCount>
      </OverallCountsField>
    </Report>

     

  • 相关阅读:
    elasticsearch CriteriaQuery查询例子
    mysql转ElasticSearch的分析 及JAVA API 初探
    java利用HttpClient进行https接口调用
    JDK8新特性:使用stream、Comparator和Method Reference实现集合的优雅排序
    java爬虫入门
    AndroidStudio升到最新版本(3.1.2)之后
    怎样录制简单GIF动图
    android 集成友盟分享之后,想自定义分享面板的看过来
    Android代码中设置字体大小,字体颜色,显示两种颜色.倒计时效果
    Android新特性之CardView的简单使用
  • 原文地址:https://www.cnblogs.com/limei/p/1887899.html
Copyright © 2011-2022 走看看