65.9K
CodeProject 正在变化。 阅读更多。
Home

BizUnit 4.0 测试步骤 - MQSC (IBM WebSphere MQ)。

starIconstarIconstarIconstarIconstarIcon

5.00/5 (1投票)

2013年2月21日

CPOL

10分钟阅读

viewsIcon

20163

downloadIcon

292

BizUnit 4.0 中的新测试步骤,用于 MQSC

介绍 

正如我们所知,BizTalk 项目作为中间件通常是关键任务,它总是位于不同应用程序之间,而 BizTalk 部分出现故障会导致其他系统停滞。因此,本文将介绍使用 BizUnit 4.0 对 BizTalk 进行自动化测试。

BizUnit 4.0 - 现已推出。这是一个主要版本,进行了重大更改,使得创建编码测试和 XAML 测试更加容易。新版本 4.0 (BizUnit.TestSteps) 默认不支持 MQSC,您需要添加对 BizUnit.MQSeriesSteps 的引用,但它只接受 XML 配置,而不是 C# 代码,并且 BizUnit.MQSeriesSteps 也已弃用。因此,我在 BizUnit.TestSteps 中创建了新的测试步骤。

本文涵盖:

  • 非常简单的 BizTalk 项目,它读取文件并将消息放入 MQSC。
  • 如何在 BizUnit 4.0 中创建新的 MQSCStepHT 测试步骤,它像其他测试步骤(C# 和 XML/XAML)一样方便地访问 MQSC。
  • 用于使用 MQSCStepHT 的测试项目

背景  

BizUnit (参考:http://bizunit.codeplex.com/)

采用自动化测试策略对于降低软件开发项目相关的风险至关重要,它是确保交付高质量软件的关键。然而,开发自动化测试的开销通常被认为过高,从而成为不采用自动化测试的原因。

BizUnit 能够快速开发自动化测试。BizUnit 是一个灵活且可扩展的声明式测试框架,旨在快速实现分布式系统的自动化测试,例如,它广泛用于测试 BizTalk 解决方案。BizUnit 是完全可扩展的。其方法是通过通用可重用测试步骤来构建测试用例,测试用例在 XML 中定义,这使得它们可以自动生成,并且还可以对不同环境(例如,测试、暂存和生产环境)的 URL 进行“修复”。在 XML 中定义测试用例可以自动生成测试用例。

此 BizUnit 测试将执行以下操作:

  1. 将输入文件复制到 BizTalk 项目的接收位置。
  2. 读取 MQ 中的输出数据
  3. 根据输出文件格式 (XSD) 验证 MQ 数据
  4. 验证文件内容 (XPATH)

先决条件

  1. 您必须熟悉 BizTalk
  2. 对 BizUnit 有所了解
  3. 所需软件
  4. Visual Studio 2010
    • BizTalk 2010
    • BizUnit 4.0 (4.0.154.0) (http://bizunit.codeplex.com/releases/view/66850)
    • IBM WebSphere 上的消息队列

使用代码 

项目:BizTalk MQSC

这将是我们使用 BizUnit 进行测试的项目。所以我们需要先创建这个项目。

这将是一个非常简单的 BizTalk 项目,足以满足我们即时需求。在这里,我们以保险公司场景为例,我们接收有关保单的基本查询。保单详细信息存储在大型机系统中,我们通过 MQ 将数据传递给大型机。(各位,请不要考虑场景标准化。我知道在现实生活中这将是 HIPAA)

我将此 BizTalk 项目附加到本文中,以便您可以直接部署以进行测试。

项目工件:

  • 两个模式,一个用于输入,另一个用于大型机输入(BizTalk 项目的输出)
  • 一个映射,用于执行输入文件和大型机文件之间的映射
  • 编排,用于设计消息流并绑定端口

输入模式

输入消息的结构。我们在此获取保单持有人 ID、姓名、地址和雇主 ID。

此模式的实例

<ns0:Ind xmlns:ns0="http://HT1_MQ.SchIN">
  <ID>ABC009</ID> 
  <FName>Himanshu</FName> 
  <LName>Thawait</LName> 
  <Address>KCMO</Address> 
  <EmployerID>iGate01</EmployerID> 
</ns0:Ind>
大型机模式

大型机输入消息的结构。需要团体保单号和会员号来提取所有详细信息

此模式的实例

将是 BizTalk 项目的输出

映射

一个非常简单的映射,它将传入消息的 ID 字段映射到大型机模式的 MemNum 字段,并将 EmployeeID 映射到 GrpPolicyNum 字段,通过附加“GRP:”使用 String Concatenate functoid。

业务流程

这是我们的编排,它有一个接收端口,用于从文件夹拾取消息(输入 XML 文件)并将其传递给 Rec 形状,然后它使用 Expression 形状和编排变量 (Trace Log) 记录事件日志,并使用上述映射为大型机构建消息。它再次记录关于进程完成的事件日志,并将此消息发送到与 MQSC 绑定的发送端口 (H1_MQ_SEN)。

 

如何指定 MQSC 绑定

这里有个窍门:MQSC 无法在 64 位 BizTalk Host Instance 上运行,因此您需要为您的编排和连接到 MQSC 的端口创建一个 32 位 Host Instance。

部署

项目已准备好部署,分配 snk,为应用程序命名,设置配置和服务器,然后部署。有关部署的详细信息:(http://msdn.microsoft.com/en-us/library/aa559168.aspx)

项目:BizUnit.TestSteps-Ench-创建 MQSCStepHT 测试步骤

在详细介绍之前,我想强调一下先决条件 #2(对 BizUnit 有所了解)。我假设到目前为止您已经下载并安装了 BizUnit 4.0,并且还解压缩了其源代码“BizUnit.Source”到 C:\Program Files\BizUnit\BizUnit 4.0\Source(默认位置)。

我不会将整个 BizUnit.TestStep 附加到本文中。您需要将以下类添加到您现有的 BizUnit.TestStep 中。

现在是时候为 MQSC 添加新的测试步骤了

  • 转到“BizTalk\BizUnit4.0_Src\Src\BizUnit.TestSteps”并打开“BizUnit.TestSteps”
  • 添加对“amqmdnet.dll”的引用。我使用的是 ver 1.0.0.2。这是 IBM 的 .NET 版 WebSphere MQ 类的实现 DLL。引用应如下所示:
  • 向项目中添加新的“MQSCHT”文件夹
  • 将“MQSeriesHelper.cs”从 C:\Program Files\BizUnit\BizUnit 4.0\Source\BizUnit4.0_Src\Src\BizUnit.MQSeriesSteps\Utilities 复制到“MQSCHT”。这是 Kevin B. Smith 创建的用于处理 MQSC 的辅助类。
  • 在“MQSCHT”中添加新的类文件“MQSCGetStepHT.cs”

MQSCGetStepHT.cs 的代码

代码本身很容易理解。不过,最好稍微解释一下。此类核心是 TestStepBase,所有 BizUnit 测试步骤都必须继承自它,才能使其成为 BizUnit 测试步骤。它有两个抽象方法需要在此实现。

它有一个构造函数,用于初始化 Sub Step。subStep 是“由测试步骤执行的子步骤列表,可能有一个或多个子步骤。每个子步骤都会被调用,并且数据通常会从一个传递到下一个。”

Execute(Context context):这里是为 MQSC 读取编写的实际逻辑和代码。执行测试步骤的逻辑。参数:context:当前 TestCase 中使用的测试上下文

Validate (Context context):您可以在此处编写验证逻辑,例如检查某些必需的属性及其有效值。这将在测试步骤执行时运行。

///Himanshu Thawait
///Test step to work with MQSC. using amqmdnet.dll and MQSeriesHelper.cs

using System;
using System.Collections.ObjectModel;
using System.IO;
using BizUnit.TestSteps.Common;
using BizUnit.Xaml;

namespace BizUnit.TestSteps.MQSCStepHT
{

    public class MQSCGetStepHT : TestStepBase
    {
        private string message;

        /// <summary>
        /// Que Manager details server (port)
        /// </summary>
        public string queueManager { get; set; }
        /// <summary>
        /// Query name
        /// </summary>
        public string queue { get; set; }
        /// <summary>
        /// Wait time out
        /// </summary>
        public int waitTimeout { get; set; }

        /// <summary>
        /// Used for Sub steps
        /// </summary>
        public MQSCGetStepHT()
        {
            SubSteps = new Collection<SubStepBase>();
        }

        /// <summary>
        /// Read the data from MQ
        /// </summary>
        /// <param name="context"></param>
        public override void Execute(Context context)
        {
            context.LogInfo("Reading queue: {0}, search queueManager: {1}", queue, queueManager);
            message = MQSeriesHelper.ReadMessage(queueManager, queue, waitTimeout, context);
            context.LogData("MQSeries output message:", message);

            // SubSteps
            // Check it against the validate steps to see if it matches one of them
            foreach (var subStep in SubSteps)
            {
                try
                {
                    Stream fileData = StreamHelper.LoadMemoryStream(message);
                    // Try the validation and catch the exception
                    fileData = subStep.Execute(fileData, context);
                }
                catch (Exception ex)
                {
                    context.LogException(ex);
                    throw;
                }
            }
        }

        /// <summary>
        /// Validation on MQ and Data  data
        /// </summary>
        /// <param name="context"></param>
        public override void Validate(Context context)
        {
            if (string.IsNullOrEmpty(queueManager))
            {
                throw new StepValidationException("queueManager may not be null or empty", this);
            }

            if (string.IsNullOrEmpty(queue))
            {
                throw new StepValidationException("queue may not be null or empty", this);
            }

        }
    }
}

MQSeriesHelper.cs 的代码

这是 Kevin B. Smith 为 MQSC 编写的辅助类。这里没有更改,使用其原始状态。

构建

我们已准备好构建项目并在测试项目中使用。所以构建项目,它应该更新“BizUnit.TestSteps.dll”。检查“修改日期”以验证它是否正确。它有新的测试步骤“MQSCStepHT”

项目:测试项目

现在我们已准备好进行测试。BizTalk 项目正在运行,将文件放入 MQSC,而我们新的测试步骤已在 BizUnit 中可用,可以从 MQSC 读取。创建新的测试项目并添加对BizUnit.dllBizUnit.TestSteps.dll 的引用,默认位置为C:\Program Files\BizUnit\BizUnit 4.0\Bins\。引用应如下所示:我将此测试项目附加到本文中,以便您可以直接部署以进行测试。

 

最后,我们一切就绪,可以为 MQSC 编写测试用例。此测试项目将使用与 BizTalk MQSC 项目相同的文件夹下拉位置、模式和 XML 文件(显然,因为我们将测试该项目)。

  • 文件下拉位置:\\FileServer\Share\HT1\IN_MQ\ 与 BizTalk MQSC 项目使用的位置相同
  • 输入文件:IN_MQ.xml
  • 模式:SchOUT.xsd,与 BizTalk MQSC 的输出消息(大型机模式)相同

HT1_MQ.cs 的代码

此类中有两个测试用例。一个是使用 BizUnit.TestSteps.File(开箱即用的测试步骤)将 XML 文件复制到 BizTalk 拾取位置,另一个是使用我们的 BizUnit.TestSteps.MQSCStepHT 从 MQSC 读取数据。

这里需要记住的事情是:

RunTest() 是关键。您编写的任何代码(在 MQSCStepHT 中)在调用此 RunTest() 之前都不会实际执行。因此,如果您要调试代码,请等待此函数被调用,然后您的断点才会命中(在 MQSCStepHT 中)。

要了解 BizUnit 测试步骤,请阅读:“BizUnit 入门指南.pdf”,它随 BizUnit 4.0 一起安装。默认位置 C:\Program Files\BizUnit\BizUnit 4.0

在我的测试用例中,我决定将代码分为 6 个步骤。
  • 步骤 1:创建 TestCase 对象,它实际上将包含许多内容的测试用例。
  • 步骤 2:准备步骤,您在此设置要分配给执行步骤的内容。例如,设置文件下拉位置并分配源文件路径。
  • 步骤 3:执行步骤,您在此将步骤 2 分配给步骤 1 的 testcase。
  • 步骤 4:这是一个可选步骤,您可以在其中将 testcase 保存为 XAML 文件格式。因为 BizUnit 也可以很好地处理基于 XAML 的测试步骤。
  • 步骤 5:创建 BizUnit 实例来运行。将步骤 1 的 testcase 分配给 BizUnit 对象。
  • 步骤 6:通过 RunTest() 实际运行测试。

这是完整的代码:

using BizUnit.TestSteps.Common;
using BizUnit.TestSteps.DataLoaders.File;
using BizUnit.TestSteps.File;
using BizUnit.TestSteps.MQSCStepHT;
using BizUnit.TestSteps.ValidationSteps.Xml;
using BizUnit.Xaml;
using Microsoft.VisualStudio.TestTools.UnitTesting;


namespace HT1.TestData
{
    [TestClass]
    public class HT1_MQ
    {
        [TestMethod]
        public void MQ_TC1_CopyFileToProcess()
        {
            //1. Creat test case
            var TC1 = new TestCase { Name = "H31 TC2", Category = "In Run", Preconditions = "H31 TC1" };

            //2.0 Prepration for **Execution Step**- Copy file to IN folder
            var createStep = new CreateStep();
            createStep.CreationPath = @"\\FileServer\Share\HT1\IN_MQ\IN_MQ.xml";
            //2.3 Source File
            var dataLoder = new FileDataLoader { FilePath = @"\\FileServer\Share\HT1\IN_MQ.xml" };

            createStep.DataSource = dataLoder;


            //3 Execution Step- Copy file
            TC1.ExecutionSteps.Add(createStep);

            //4 Optional steps- Save Test case to XMAL file
            TestCase.SaveToFile(TC1, TC1.Name + ".xmal");

            //5.Create BizUnit instance to run
            var bizunit = new BizUnit.BizUnit(TC1);

            //6.Actually run the test
            bizunit.RunTest();
        }


        [TestMethod]
        public void MQ_TC2_Read()
        {
            //1. Create Test case
            var TC1 = new TestCase { Name = "H31.MQ.TC1", Category = "IN run", Purpose = "Verify MQData" };

            //2.0 Prepration for **Execution Step**- Setup MQSC setting
            var mqscStep = new MQSCGetStepHT();
            mqscStep.queueManager = "MQSCMger";
            mqscStep.queue="MQSC.TEST.IN";


            //2.1 Validate XML again Schems
            var xmlValidationStep = new XmlValidationStep();
            var schemaDefination = new SchemaDefinition
            {
                XmlSchemaPath = @"\\FileServer\Share\HT1\SchOUT.xsd",
                XmlSchemaNameSpace = "http://HT1_MQ.SchOUT"
            };

            //2.2 Adding schemt to validate
            xmlValidationStep.XmlSchemas.Add(schemaDefination);

            //2.3 Validate XML data Using XPath
            var xpathRecCount = new XPathDefinition
            {
                Description = "Checking the GrpPolicyNum",
                XPath = "/*[local-name()='Member' and namespace-uri()='http://HT1_MQ.SchOUT']/*[local-name()='GrpPolicyNum' and namespace-uri()='']",
                Value = "GRP:iGate01"
            };


            //3 Execution Step- check MQ data
            xmlValidationStep.XPathValidations.Add(xpathRecCount);
           
            //3.1 sub step
            mqscStep.SubSteps.Add(xmlValidationStep);

            //3.2 Main step
            TC1.ExecutionSteps.Add(mqscStep);

            //4 Optional steps- Save Test case to XMAL file
            TestCase.SaveToFile(TC1, TC1.Name + ".xmal");

            //5.Create BizUnit instance to run
            var bizunit = new BizUnit.BizUnit(TC1);

            //6.Actually run the test
            bizunit.RunTest();

           
        }
    }
}
MQ_TC2_Read()

在步骤 2(2.1、2.2、2.3)中包含了一些额外的内容,用于验证消息格式和其中的数据。

  • 步骤 2.0:我们只是设置 MQSC 详细信息
  • 步骤 2.1 和 2.2:我们知道数据是 XML 格式,并且我们有该 XML 的模式。因此,我们想根据模式验证 MQ 数据。
  • 步骤 2.3:我们还想深入到节点级别并验证其中的值。所以我们使用 xpath 查询来获取节点的值。我们从 BizTalk 模式编辑器“实例 xpath”属性中获取了这个 xpath 查询。

获取实例 xpath

现在是时候运行了

BizUnit 测试用例将像任何其他测试用例一样运行。只需选择您的测试用例,右键单击并点击运行。

 

正如您所见,您可以选择多个测试用例来运行。要指定测试用例执行的永久顺序,您可以添加“Order test”,在这里您可以看到测试用例列表并以所需的顺序选择它们。然后,您无需选择单个测试用例,只需选择并运行此 Order test 文件。

 

需要记住的事情:如果您想调试代码并命中断点,请右键单击测试用例并选择“Debug Selection”。

测试结果

运行测试用例时,会在 VS 底部的窗体中出现“Test Result”选项卡。在这里,您可以看到测试用例的状态,如 pass、failed、aborted 和 running。要查看详细信息,请右键单击测试结果并选择“View Test Result Details”。

这是测试详情的样子,让我们看看如何读取它。

它有两部分:

  • Common Result 只会提供有关谁在何时在哪个计算机上运行等信息。
  • Standard Console Output:在这里您会得到大部分信息。我标记了 4 个地方,让我们看看每个地方告诉我们什么。
  1. 告诉我们 MQSC 的配置值
  2. 告诉我们 MQSC 中有什么数据
  3. 将要验证模式和值
  4. 3.1:表示值符合预期。所以测试通过了

每次测试运行都会将完整的详细信息存储在“.trx”文件中,即“Visual Studio Test Results File”格式,位于“TestResults”文件夹中。文件名包含运行此测试用例的用户以及计算机名称以及日期时间戳。

最后,完成了,希望它能帮到您。

下一步

我已经为 RESTful 服务和 Oracle 编写了测试步骤,我将为此创建类似的帖子。

参考

BizUnit 4.0:http://bizunit.codeplex.com/

BizUnit 文件步骤,我也喜欢文章风格:https://codeproject.org.cn/Articles/243970/BizUnit-4-0-and-BizTalk-2010

历史 

  • 版本 1.0 日期:2013-02-21
© . All rights reserved.