1

使用 sdk2,我想知道一个项目中有多少测试,以及这些测试中有多少是手动的还是自动化的。看来我应该能够使用Collection Summary来做到这一点。使用摘要的优点是,我可以返回一个测试计数,而不是数百个测试的列表,或者进行多个查询(一个用于所有测试,一个用于手动测试)。

但是该示例显示了如何查询用户故事的缺陷摘要。它现在确实显示是否可以获得多选或其他类型字段的摘要。

我试图猜测下面的语法可能是什么,但它不起作用:

Ext.create('Rally.data.wsapi.Store', {
    model: 'TestCase',
    fetch: ['Method:summary[Manual,Automated]'],  // This is the key statement: how to fetch a summary?
    pageSize: 1,
    autoLoad: true,
    listeners: {
        load: function(store, records) {
            var testcase = records[0];
            var methodInfo = testase.get('Method');
            var manualCount = methodInfo.Manual;
        }
    }
});

是否可以使用集合摘要在只有一个结果的查询中执行此操作?

4

1 回答 1

1

这对于诸如 TestCase.Method 之类的非集合属性肯定是有用的。然而,WSAPI 2.0 集合摘要的开发是为了提供一种方便的方法来获取和汇总工件子集合的计数,而无需返回到 WSAPI 并查询集合本身。由于 WSAPI 2.0 出于性能原因删除了自动水合子集合的功能,因此摘要功能很重要。

因此,summary 方法可用于汇总 Artifact 上的子对象集合的属性计数,例如:

  1. 按状态总结缺陷任务:https://rally1.rallydev.com/slm/webservice/v2.0/defect?fetch=Tasks:summary[State]&order=Rank
  2. 业主对故事的缺陷:https://rally1.rallydev.com/slm/webservice/v2.0/hierarchicalrequirement?fetch=Defects:summary[Owner]&order=ScheduleState

要保存加载整个商店以获取属性计数,您可以通过 TestCase 方法在商店上设置过滤器,并使用单位页面大小来防止加载完整的记录集。然后使用getTotalCount()来总结你想要的计数。

但是,由于必须加载 WsapiStore 并处理要汇总的每个属性的回调,这可能会有点麻烦。

不过,通过使用 Deft.js 和 Promises,它更容易接受。下面是一个使用 promises 和 Deft.Deferred 实现 _getCount(modelType, attribute, attrValue) 函数的基本示例:

截图1

Ext.define('CustomApp', {
    extend: 'Rally.app.App',
    componentCls: 'app',

    items: [
        {
            xtype: 'container',
            itemId: 'gridContainer',
            columnWidth: 1
        }
    ],

    _summaryGrid: null,

    launch: function() {

        this._summarizeTestCaseCounts();

    },


    _summarizeTestCaseCounts: function() {

        var me = this;
        var promises = [];
        var resultArray = [];

        promises.push(me._getCount('TestCase', 'Method', 'Manual'));
        promises.push(me._getCount('TestCase', 'LastVerdict', 'Failed'));
        promises.push(me._getCount('TestCase', 'LastVerdict', 'Pass'));

        Deft.Promise.all(promises).then({
            success: function(results) {
                Ext.Array.each(results, function(result) {
                    resultArray.push(result);
                    console.log(result);
                });
                // Create grid from summarized results
                me._makeGrid(resultArray);
            }
        });

    },

    _getCount: function(modelType, attribute, attrValue) {
        var deferred = Ext.create('Deft.Deferred');

        var artifactStore = Ext.create('Rally.data.wsapi.Store', {
            model: modelType,
            pagesize: 1,
            autoLoad: true,
            filters: [
                {
                    property: attribute,
                    operator: '=',
                    value: attrValue
                }
            ],
            sorters: [
                {
                    property: 'FormattedID',
                    direction: 'ASC'
                }
            ],
            listeners: {
                load: function(store, records) {
                    var manualCount = store.getTotalCount();
                    result = {
                        "ModelType": modelType,
                        "Attribute": attribute,
                        "Value": attrValue,
                        "Count": manualCount
                    };
                    deferred.resolve(result);
                }
            }
        });

        return deferred;
    },

    _makeGrid: function(results) {

        var me = this;

        if (me._summaryGrid) {
            me._summaryGrid.destroy();
        }

        var gridStore = Ext.create('Rally.data.custom.Store', {
            data: results,
            pageSize: 5,
            remoteSort: false
        });

        me._summaryGrid = Ext.create('Rally.ui.grid.Grid', {
            itemId: 'artifactGrid',
            store: gridStore,

            columnCfgs: [
                {
                    text: 'Artifact', dataIndex: 'ModelType'
                },
                {
                    text: 'Attribute', dataIndex: 'Attribute'
                },
                {
                    text: 'Value', dataIndex: 'Value'
                },
                {
                    text: 'Count', dataIndex: 'Count'
                }
            ]
        });

        me.down('#gridContainer').add(me._summaryGrid);
        me._summaryGrid.reconfigure(gridStore);
    }
});

顺便说一句,Matt Greer最近写了一篇精彩的博客文章,概述了他对使用 Deft.js 承诺的深入研究。这对我在构建 Rally 应用程序时了解如何使用它们非常有帮助。

于 2014-03-15T20:36:50.773 回答