Ibm mobilefirst 如何最好地测试(单元测试)独立于WL应用程序的WL适配器+;茉莉花测试:不能使用';在';操作员搜索';支持COOKIES';无效

Ibm mobilefirst 如何最好地测试(单元测试)独立于WL应用程序的WL适配器+;茉莉花测试:不能使用';在';操作员搜索';支持COOKIES';无效,ibm-mobilefirst,worklight-adapters,Ibm Mobilefirst,Worklight Adapters,关于这个问题: 但由于Jasmine测试工具和关于JS Java适配器测试最佳实践的一般问题不同 我们正在为一组开发人员建立一个开发环境,包括持续集成、构建和自动测试 为此,我们需要有一种方法从独立于实际Worklight应用程序或任何Worklight客户端运行的独立测试用例/客户端(测试代码)调用WL服务器上的WL适配器。 这些测试必须在部署和连续构建时运行,并将测试适配器 我们提出了这个解决方案,因为在部署适配器之前,无法在本地测试适配器。此外,我们不能将测试代码真正包含到适配器中,并

关于这个问题:

但由于Jasmine测试工具和关于JS Java适配器测试最佳实践的一般问题不同


我们正在为一组开发人员建立一个开发环境,包括持续集成、构建和自动测试

为此,我们需要有一种方法从独立于实际Worklight应用程序或任何Worklight客户端运行的独立测试用例/客户端(测试代码)调用WL服务器上的WL适配器。 这些测试必须在部署和连续构建时运行,并将测试适配器

我们提出了这个解决方案,因为在部署适配器之前,无法在本地测试适配器。此外,我们不能将测试代码真正包含到适配器中,并将代码与适配器一起部署。这将不是一个好的解决方案,我们将在带有适配器的服务器上测试代码

我们可能会使用JasmineJUnit作为我们的测试工具,我试图通过将所有Worklight JS库和变量(Worklight编译器添加到最终编译和部署的App.html)包含到Jasmine测试中来设置一个独立的Jasmine Worklight客户端/测试

它为某个零件运行,似乎初始化正常:

wlclient init started worklight.js:1112
before: app init onSuccess worklight.js:1112
after: app init onSuccess worklight.js:1112
wlclient init success
但是当我想执行WL.Client.invokeProcedure(invokeData)时,我会得到以下错误:

TypeError:无法使用“in”运算符在null中搜索“SUPPORT\u COOKIES”

因此,我的独立Worklight客户端/测试中似乎缺少一些配置或初始化。 有谁能告诉我那可能是什么

<head>
    <title>Jasmine Spec Runner</title>
 <link rel="stylesheet" type="text/css" href="lib/jasmine-1.3.1/jasmine.css">

<script>
        // Define WL namespace.
        var WL = WL ? WL : {};

        /**
         * WLClient configuration variables.
         * Values are injected by the deployer that packs the gadget.
         */


        WL.StaticAppProps = {
         "APP_DISPLAY_NAME": "app",
   "APP_SERVICES_URL": "\/tests\/",
   "APP_VERSION": "1.0",
   "ENVIRONMENT": "preview",
   "HEIGHT": 460,
   "LOGIN_DISPLAY_TYPE": "popup",
   "LOGIN_POPUP_HEIGHT": 610,
   "LOGIN_POPUP_WIDTH": 920,
   "PREVIEW_ENVIRONMENT": "common",
   "WIDTH": 320,
       "WORKLIGHT_ROOT_URL": "\/tests\/"
    };



<script src="lib/common/js/wljq.js"></script>
        <script src="lib/common/js/base.js"></script>
        <script src="lib/common/js/containerCommunicationAPI.js"></script>
        <script src="lib/wlclient/js/messages.js"></script>
        <script src="lib/common/js/wlcommon.js"></script>
        <script src="lib/common/js/busy.js"></script>
        <script src="lib/wlclient/js/diagnosticDialog.js"></script>
        <script src="lib/wlclient/js/deviceAuthentication.js"></script>
        <script src="lib/wlclient/js/window.js"></script>
        <script src="lib/wlclient/js/worklight.js"></script>
        <script src="lib/wlclient/js/gadgetCommunicationAPI.js"></script>
        <script src="lib/wlclient/js/wlclient.js"></script>
        <script src="lib/wlclient/js/wlfragments.js"></script>
        <script src="lib/wlclient/js/encryptedcache.js"></script>
        <script src="lib/wlclient/js/jsonstore/jsonstore.js"></script>
        <script src="lib/wlclient/js/challengeHandlers/antiXSRFChallengeHandler.js"></script>
        <script src="lib/wlclient/js/challengeHandlers/authenticityChallengeHandler.js"></script>
        <script src="lib/wlclient/js/challengeHandlers/deviceAuthAutoProvisioningChallengeHandler.js"></script>
        <script src="lib/wlclient/js/challengeHandlers/deviceAuthNoProvisioningChallengeHandler.js"></script>
        <script src="lib/wlclient/js/challengeHandlers/remoteDisableChallengeHandler.js"></script>
            <script src="../apps/app/common/js/jquery-1.10.1.min.js"></script>
    <!-- script>window.$ = window.jQuery = WLJQ;</script-->
    <script src="../apps/app/common/jqueryMobile/jquery.mobile-1.3.1.js"></script>

    <script src="../apps/app/common/js/initOptions.js"></script>
     <script src="../apps/app/common/js/messages.js"></script>


    <script type="text/javascript" src="lib/jasmine-1.3.1/jasmine.js"></script>
    <script type="text/javascript" src="lib/jasmine-1.3.1/jasmine-html.js"></script>

    <!-- include source files here... -->

    <!--<script type="text/javascript" src="../apps/app/common/js/knockout-2.2.1.js"></script>-->
    <!--<script type="text/javascript" src="../apps/app/common/js/knockout.mapping-latest.js"></script>-->
    <!--<script type="text/javascript" src="../apps/app/common/js/globalize.js"></script>-->
    <!--<script type="text/javascript" src="../apps/app/common/js/app.js"></script> -->
    <!--<script type="text/javascript" src="../apps/app/common/js/common.js"></script>-->
    <!--<script type="text/javascript" src="../apps/app/common/js/date.js"></script>-->
    <!--<script type="text/javascript" src="../apps/app/common/js/localize.js"></script>-->
    </script>-->


    <!-- include spec files here... -->
    <!--script type="text/javascript" src="spec/SpecHelper.js"></script-->
    <script type="text/javascript" src="spec/TestSpec.js"></script>
但是现在我遇到了访问控制问题,因为我的WL Jasmine测试客户端在端口80上的Apache上运行,而在端口8080上的WL服务器上的适配器运行

running test worklight.js:1112
Application did not define an i18n messages object, skipping translation. worklight.js:1112
wlclient init started worklight.js:1112
before: app init onSuccess worklight.js:1112
after: app init onSuccess worklight.js:1112
wlclient init success worklight.js:1112
ExecJasmine worklight.js:1112
Request [http://XXX:8080/apps/services/api/app/desktopbrowser/query] worklight.js:1112
running test 2 worklight.js:1112
OPTIONS http://XXX:8080/apps/services/api/app/desktopbrowser/query 401 (Unauthorized) base.js:883
OPTIONS http://XXX:8080/apps/services/api/app/desktopbrowser/query Origin http://XXX is not allowed by Access-Control-Allow-Origin. base.js:883
XMLHttpRequest cannot load http://XXX:8080/apps/services/api/app/desktopbrowser/query. Origin http://XXX is not allowed by Access-Control-Allow-Origin. SpecRunnerAdapter.html:1
Refused to get unsafe header "X-JSON" base.js:994
[http://XXX:8080/apps/services/api/app/desktopbrowser/query] Host is not responsive. worklight.js:1112
{"invocationContext":null,"errorCode":"UNRESPONSIVE_HOST","errorMsg":"The service is currently not available."} worklight.js:1112
Refused to get unsafe header "X-JSON" 
使用此WL测试客户端应用程序配置:

        WL.StaticAppProps = {
   "APP_DISPLAY_NAME": "app",
   "APP_SERVICES_URL": "http:\/\/XXX:8080\/apps\/services\/",
   "APP_VERSION": "1.0",
   "ENVIRONMENT": "desktopbrowser",
   "HEIGHT": 460,
   "LOGIN_DISPLAY_TYPE": "popup",
   "LOGIN_POPUP_HEIGHT": 610,
   "LOGIN_POPUP_WIDTH": 920,
   "WIDTH": 320,
   "WORKLIGHT_ROOT_URL": "http:\/\/XXX:8080\/apps\/services\/api\/app\/desktopbrowser\/"
};
我想我们到此为止,只需使用WL服务器上的INVOKE服务在测试环境中为JUnit测试调用WL_无保护适配器过程。


然后找出如何在构建/部署时保护生产过程,同时删除单元测试执行,因为它们不再与安全适配器一起工作。

对于单元测试,您最好的选择是使用WL适配器调用服务。根本不需要客户端代码,只需创建HTTP即可对WL服务器的请求:


假设您希望对适配器代码进行单元测试,如指定问题的标题,我将注意以下几点:

  • 单元测试的范围是单个代码单元,在JavaScript中通常意味着一个小函数。您可以测试
    sum(1,2)
    是否返回
    3
    。您可以自动打开显示计算器应用程序的URL,模拟用户输入以单击按钮(
    1
    2
    =
    )等待计算事件返回
    3
    ,测试代码从DOM读取输出。前者描述单元测试,后者描述集成/功能测试。如果需要功能测试,请读取。如果需要单元测试,请继续读取

  • 模拟与第三方API(例如Worklight、jQuery、Dojo)相关的所有内容。这些API已经过测试,并且已知可以工作,至少这是一个合理的假设。例如,当您编写JUnit测试时,您假设标准Java库中的所有内容都可以按照文档中的规定工作。这是一个用于创建JavaScript模拟、存根和间谍的很棒的库

  • 使用或读取适配器的JavaScript实现文件的JavaScript(例如,
    myCalculatorAdapter impl.js
    )。有许多好方法可以创建断言,例如,如果您选择Node.js路径

下面是一些示例代码,假设这是我的适配器过程:

myCalculatorAdapter impl.js

function sum (a, b) {
    WL.Logger.debug({hello: 'world'});
    return a+b;
}
//Mocks
var WL = {};
WL.Logger = {};
WL.Logger.debug = function (msg) {
    console.log(msg);
};

//Node.js Libraries
var fs = require('fs'),
    assert = require('assert');

//Read the adapter code
eval(fs.readFileSync('./myCalculatorAdapter-impl.js').toString());

//Do assertions -- Unit testing
assert.equal(sum(1, 2), 3, '1+2 should be 3');
假设以下内容包含我对所述适配器过程的单元测试:

test.js

function sum (a, b) {
    WL.Logger.debug({hello: 'world'});
    return a+b;
}
//Mocks
var WL = {};
WL.Logger = {};
WL.Logger.debug = function (msg) {
    console.log(msg);
};

//Node.js Libraries
var fs = require('fs'),
    assert = require('assert');

//Read the adapter code
eval(fs.readFileSync('./myCalculatorAdapter-impl.js').toString());

//Do assertions -- Unit testing
assert.equal(sum(1, 2), 3, '1+2 should be 3');
我使用:
node test.js
运行它。如果我在运行它时将实现更改为减法而不是加法(
返回a-b
),我会收到失败的警报
断言错误:1+2应该是3

我使用了Node.js提供的库,您可能希望使用具有更多功能的库。类似地,您可能希望使用库模拟第三方API或不适用于当前测试的内容。如果您正在进行网络通信,您将希望模拟输入


当然还有其他测试适配器的方法,请随意尝试和分享。

谢谢您的回答。从典型的eclipse开发工作中,我们当然知道调用服务。这对于开发和初始测试来说是很好的,但对于连续构建来说并不好。特别是由于您的需求更改适配器的安全设置,例如securityTest=“wl\U未受保护”。我们需要将适配器部署在具有所有安全性、领域等的生产就绪配置中。首先,您不必在不受保护的情况下使用wl_,这只是为了方便。但是,请注意,如果您不使用它,您必须在模拟客户机中实现客户机逻辑。此外,适配器调用服务不仅仅是开发人员,我还需要t是WL server的一个完整的生产功能。谢谢你的回答。我明白了,我在阅读信息中心时没有意识到这一点,谢谢。现在,从移动安全测试(如XSRF等)和定制AdapterAuthenticator ChallengeHandler中获得一些关于如何处理标准WL安全功能的示例当然很好JAVA