Show Menu
主题×

自动测试自适应表单

概述

自适应表单是客户互动不可或缺的一部分。 使用您在表单中做出的每项更改(例如推出新的修复包或更改表单中的规则)测试自适应表单非常重要。 但是,功能测试自适应表单及其中的每个字段可能都很繁琐。
Calvin允许您在Web浏览器中自动测试自适应表单。 卡尔文利 用霍布斯 的用户界面来运行测试,并提供以下工具:
  • 用于创建测试的JavaScript API。
  • 用于运行测试的用户界面。
使用Calvin,您可以在CRXDE中创建测试用例,并直接在Web浏览器中运行UI测试,以全面测试自适应表单的以下方面:
要测试的自适应表单方面 描述
自适应表单的预填体验
  • 表单是否会根据数据模型的类型按预期方式预填充?
  • 表单对象的默认值是否按预期方式预填充?
提交自适应表单的体验
  • 提交时是否生成了正确的数据?
  • 在提交过程中,表单是否正在服务器上重新验证?
  • 是否为正在执行的表单配置了提交操作?
表达式规则
  • 是否在执行相关UI操作后执行与表单对象关联的表达式,如计算、可见、退出字段后执行脚本?
验证
  • 执行操作后,字段验证是否按预期方式执行?
延迟加载
  • 单击选项卡(或面板的任何导航项)后,是否会根据延迟加载配置从服务器获取HTML?
UI交互

前提条件

在使用本文创建测试用例之前,您需要了解以下内容:

示例:使用Hobbes作为测试框架为自适应表单创建测试套件

以下示例将指导您逐步创建一个测试套件以测试多个自适应表单。 您需要为需要测试的每个表单创建单独的测试用例。 通过执行与以下步骤类似的步骤并在步骤11中修改JavaScript代码,您可以创建自己的测试套件来测试自适应表单。
  1. 在Web浏览器中转到CRXDE Lite: https://[server]:[port]/crx/de .
  2. 右键单击/etc/clientlibs子文件夹,然后单击“ 创建”>“创建节点” 。 输入名称(此处为afTestRegistration),将节点类型指定为cq:ClientLibraryFolder,然后单击“确 定”
    clientlibs文件夹包含应用程序(JS和Init)的注册方面。 建议您在clientlibs文件夹中注册特定于表单的所有Hobbes测试套件对象。
  3. 在新创建的节点(此处为afTestRegistration)中指定以下属性值,然后单击“全 部保存” 。 这些属性帮助霍布斯将文件夹识别为测试文件夹。 要将此客户端库作为其他客户端库中的依赖关系重复使用,请将其命名为granite.testing.calvin.tests。
属性 类型
类别
String[]
granite.testing.hobbes.tests、granite.testing.calvin.tests
依赖性
String[]
granite.testing.hobbes.testrunner、granite.testing.calvin、apps.testframework.all
granite.testing.calvin.af clientlib包含所有自适应表单API。 这些API是calvin命名空间的一部分。
  1. 右键单击测试节点(此处为 afTestRegistration) ,然后单击“ 创建”>“创建文件” 。 将文件命名为js.txt并单击“ 确定”
  2. 在js.txt文件中,添加以下文本:
    #base=.
    js.txt
    
    
  3. 单击 全部保存 ,然后关闭js.txt文件。
  4. 右键单击测试节点(此处为 afTestRegistration) ,然后单击 创建>创建文件 。 命名文件init.js,然后单击“确 定”
  5. 将以下代码复制到init.js文件,然后单击“全 部保存” :
    (function(window, hobs) {
        'use strict';
        window.testsuites = window.testsuites || {};
      // Registering the test form suite to the sytem
      // If there are other forms, all registration should be done here
        window.testsuites.testForm = new hobs.TestSuite("Adaptive Form - Demo Test", {
            path: '/etc/clientlibs/afTestRegistration/init.js',
            register: true
        });
     // window.testsuites.testForm1 = new hobs.TestSuite("testForm1");
    }(window, window.hobs));
    
    
    上述代码创建一个名为“自适应表单——演 示测试”的测试套件 。 要创建具有不同名称的测试套件,请相应地更改名称。
  6. 单击 创建 >创 建节点 ,以在要测试的每个表单的clientlib文件夹下创建一个节点。 此示例使用名为 testForm的节点测试名为testForm的自适应表单。指定以 下属 性并单击“确定 . :
    • 名称:testForm(您的表单名称)
    • 类型:cq:ClientLibraryFolder
  7. 将以下属性添加到新创建的节点(此处为testForm)以测试自适应表单:
    属性
    类型
    类别
    String #
    granite.testing.hobbes.tests、granite.testing.hobbes.testForm
    依赖性
    String #
    granite.testing.calvin.tests
    此示例使用对客户端lib granite.testing.calvin.tests的依赖性来更好地管理。 此示例还添加一个客户端库类别“granite.testing.hobbes.tests.testForm”,以根据需要重用此客户端库。
  8. 右键单击为测试表单创建的文件夹(此处为testForm),然后选择“创 建”>“创建文件” 。 将文件命名为scriptingTest.js,并将以下代码添加到文件中,然后单击“全 部保存”。
    要使用以下代码测试另一个自适应表单,请在 navigateTo (第11、36和62行)中更改表单的路径和名称以及相应的测试用例。 有关用于测试表单和表单对象不同方面的API的更多信息,请参 阅Calvin API
    (function(window, hobs) {
        'use strict';
    
     var ts = new hobs.TestSuite("Script Test", {
            path: '/etc/clientlibs/testForm/scriptingTest.js',
      register: false
     }) 
    
        .addTestCase(new hobs.TestCase("Checking execution of calculate script")
            // navigate to the testForm which is to be tested
            .navigateTo("/content/forms/af/testForm.html?wcmmode=disabled")
            // check if adaptive form is loaded
            .asserts.isTrue(function () {
                return calvin.isFormLoaded()
            })
            .execSyncFct(function () {
                // create a spy before checking for the expression
                calvin.spyOnExpression("panel1.textbox1");
                // setValue would trigger enter, set the value and exit from the field
                calvin.setValueInDOM("panel1.textbox", "5");
            })
            // if the calculate expression was setting "textbox1" value to "5", let's also check that
            .asserts.isTrue(function () {
                return calvin.isExpressionExecuted("panel1.textbox1", "Calculate");
            })
            .execSyncFct(function () {
                calvin.destroySpyOnExpression("panel1.textbox1");
            })
            .asserts.isTrue(function () {
                return calvin.model("panel1.textbox1").value == "5"
            })
        )
    
        .addTestCase(new hobs.TestCase("Calculate script Test")
            // navigate to the testForm which is to be tested
            .navigateTo("/content/forms/af/cal/demoform.html?wcmmode=disabled&dataRef=crx:///content/forms/af/cal/prefill.xml")
            // check if adaptive form is loaded
            .asserts.isTrue(function () {
                return calvin.isFormLoaded()
            })
    
            .execSyncFct(function () {
                // create a spy before checking for the expression
                calvin.spyOnExpression("panel2.panel1488218690733.downPayment");
                // setValue would trigger enter, set the value and exit from the field
                calvin.setValueInDOM("panel2.panel1488218690733.priceProperty", "1000000");
            })
            .asserts.isTrue(function () {
                return calvin.isExpressionExecuted("panel2.panel1488218690733.downPayment", "Calculate");
            })
            .execSyncFct(function () {
                calvin.destroySpyOnExpression("panel2.panel1488218690733.downPayment");
            })
            .asserts.isTrue(function () {
                // if the calculate expression was setting "downPayment" value to "10000", let's also check that
       return calvin.model("panel2.panel1488218690733.downPayment").value == 10000
            })
        )
    
        .addTestCase(new hobs.TestCase("Checking execution of Value commit script")
            // navigate to the testForm which is to be tested
            .navigateTo("/content/forms/af/cal/demoform.html?wcmmode=disabled&dataRef=crx:///content/forms/af/cal/prefill.xml")
            // check if adaptive form is loaded
            .asserts.isTrue(function () {
                return calvin.isFormLoaded()
            })
    
            .execSyncFct(function () {
                // create a spy before checking for the expression
                calvin.spyOnExpression("panel2.panel1488218690733.priceProperty");
                // setValue would trigger enter, set the value and exit from the field
                calvin.setValueInDOM("panel2.panel1488218690733.priceProperty", "100");
            })
            .asserts.isTrue(function () {
                return calvin.isExpressionExecuted("panel2.panel1488218690733.priceProperty", "Value Commit");
            })
            .execSyncFct(function () {
                calvin.destroySpyOnExpression("panel2.panel1488218690733.priceProperty");
            })
            .asserts.isTrue(function () {
             // if the value commit expression was setting "textbox1488215618594" value to "0", let's also check that
                return calvin.model("panel2.panel1488218690733.textbox1488215618594").value == 0
            })
        );
    
     // register the test suite with testForm
      window.testsuites.testForm.add(ts);
    
     }(window, window.hobs));
    
    
    将创建测试用例。 继续运行测试用例,通过Hobbes测试自适应表单。 有关运行测试用例的步骤,请参阅使 用自动测试在UI测试中执行测试
您还可以在附加的文件SampleTestPackage.zip中安装该包,以获得与示例中所述的步骤相同的结果:使用Hobbes作为测试框架为自适应表单创建测试套件。

使用自动测试测试UI

运行单个测试套件

测试套件可以单独运行。 运行测试套件时,页面会随“测试用例”及其“操作”的执行而更改,测试结果会在测试完成后显示。 图标表示结果。
复选标记图标表示通过的测试:复
“X”图标表示测试失败:交
运行测试套件:
  1. 在“测试”面板中,单击或点按要运行的测试用例的名称,以展开“操作”的详细信息。
  2. 单击或点按运行测试按钮。
  3. 测试执行时,占位符将替换为页面内容。
  4. 点按或单击说明以打开“结果”面板,查看测试用例的结果。 点按或单击“结果”面板中的测试用例名称会显示所有详细信息。
测试AEM自适应表单的步骤与测试AEM UI的步骤类似。 有关测试自适应表单的详细信息,请参阅测试UI中 的以下主题 :
  • 查看测试套件
  • 运行多个测试

术语表

期限 描述
测试套件
测试套件是一组相关测试用例。
测试用例
测试用例表示用户使用您的UI执行的任务。 将测试用例添加到测试套件以测试用户执行的活动。
操作
动作是在UI中执行手势的方法,如单击按钮或用值填充输入框。
thowet.actions.Affises、thower.actions.Core和thower.utils.af类的方法是可在测试中使用的操作。 所有操作都同步执行。
创作或发布环境
通常,表单可以在创作或发布环境中进行测试。 在发布环境中,默认情况下,执行测试的访问权限受限。 这是因为与测试运行器相关的所有客户端库都位于JCR结构中的/libs内。