0

我正在搜索 Rally 自定义 html 以显示与特定版本关联的测试集中的所有测试用例。每个测试用例都应该显示它的最新结果——但只有那些来自与指定版本相关的任何测试集的结果。如果一个测试用例在与发布相关的任何测试集中都没有结果,它仍然应该被列出,并显示为没有结果。

因为我们并行运行发布,所以我不能使用落在发布开始和结束日期内的迭代日期来确定哪些测试集和/或结果与发布相关。在 Rally 的一些 RQM 工具包示例中就是这种情况。

虽然它可以通过执行“跟踪 - 发布状态”并单击测试用例来实现,但点击次数过多,并且测试集是通过故事和缺陷列表的许多页面,并且该视图不能包含在更高级别的仪表板中。

任何帮助表示赞赏。

谢谢,

安迪

4

1 回答 1

1

这是您可以开始的示例。这个AppSDK2应用程序构建了两个网格:按发布过滤的故事和测试集。测试集网格显示相关的测试用例和测试用例状态。html 源代码可以复制到 Rally 中自定义页面的 HTML 部分。js 源文件在这个 GitHub repo中。

在此处输入图像描述

 <!DOCTYPE html>
    <html>
    <head>
        <title>Stories and TestSets by Release</title>
        <script type="text/javascript" src="/apps/2.0rc1/sdk.js"></script>
        <script type="text/javascript">
            Rally.onReady(function () {
                Ext.define('CustomApp', {
                    extend: 'Rally.app.TimeboxScopedApp',
                    componentCls: 'app',
                    scopeType: 'release',

                    addContent: function() {
                        var panel = Ext.create('Ext.panel.Panel', {
                            width: 1200,
                            layout: 'column',
                            itemId: 'parentPanel',
                            componentCls: 'panel',
                            items: [
                                {
                                    xtype: 'panel',
                                    title: 'Stories',
                                    itemId: 'childPanel1',
                                    columnWidth: 0.3
                                },
                                {
                                    xtype: 'panel',
                                    title: 'Test Sets with Test Cases',
                                    itemId: 'childPanel2',
                                    columnWidth: 0.7
                                }
                            ]
                        });
                        this.add(panel);
                        this._makeStore();
                    },

                   onScopeChange: function() {
                        console.log('onScopeChange');
                        this._makeStore();
                    },

                    _makeStore: function(){
                         var storyStore = Ext.create('Rally.data.WsapiDataStore', {
                            model: 'UserStory',
                            fetch: ['FormattedID','Name'],
                            pageSize: 100,
                            autoLoad: true,
                            filters: [this.getContext().getTimeboxScope().getQueryFilter()],
                            listeners: {
                                load: this._onStoriesLoaded,
                                scope: this
                            }
                        }); 
                    },

                      _onStoriesLoaded: function(store, data){
                                var userStories = [];
                                Ext.Array.each(data, function(story) {
                                    var s  = {
                                        FormattedID: story.get('FormattedID'),
                                        _ref: story.get("_ref"),  
                                        Name: story.get('Name'),
                                    };
                                    userStories.push(s);
                                 });
                                this._createStoryGrid(userStories);
                    },
                    _createStoryGrid:function(stories){
                        var that = this;
                        var storyStore = Ext.create('Rally.data.custom.Store', {
                                data: stories,
                                pageSize: 100
                            });
                        if (!this.down('#storygrid')) {
                            this.down('#childPanel1').grid = this.down('#childPanel1').add({
                            xtype: 'rallygrid',
                            itemId: 'storygrid',
                            store: storyStore,
                            columnCfgs: [
                                {
                                   text: 'Formatted ID', dataIndex: 'FormattedID', xtype: 'templatecolumn',
                                    tpl: Ext.create('Rally.ui.renderer.template.FormattedIDTemplate')
                                },
                                {
                                    text: 'Name', dataIndex: 'Name',flex:2
                                }
                            ],
                            listeners: {
                                render: this._makeAnotherStore,
                                scope: this
                            }
                        });
                         }else{
                            this.down('#childPanel1').grid.reconfigure(storyStore);
                            this._makeAnotherStore(this);
                         }
                    },

                    _makeAnotherStore: function(){
                        Ext.create('Rally.data.WsapiDataStore', {
                                model: 'TestSet',
                                fetch: ['FormattedID', 'TestCases', 'TestCaseStatus'],  
                                pageSize: 100,
                                autoLoad: true,
                                filters: [this.getContext().getTimeboxScope().getQueryFilter()],
                                listeners: {
                                    load: this._onTestSetsLoaded,
                                    scope: this
                                }
                            }); 
                    },
                     _onTestSetsLoaded: function(store, data){
                        var testSets = [];
                        var pendingTestCases = data.length;
                         console.log(data.length);
                         if (data.length ===0) {
                            this._createTestSetGrid(testSets); 
                         }
                         Ext.Array.each(data, function(testset){ 
                            var ts  = {
                                FormattedID: testset.get('FormattedID'),   
                                _ref: testset.get('_ref'),  
                                TestCaseStatus: testset.get('TestCaseStatus'),
                                TestCaseCount: testset.get('TestCases').Count,
                                TestCases: []
                            };
                            var testCases = testset.getCollection('TestCases');
                            testCases.load({
                                                fetch: ['FormattedID'],
                                                callback: function(records, operation, success){
                                                    Ext.Array.each(records, function(testcase){
                                                        ts.TestCases.push({_ref: testcase.get('_ref'),
                                                                        FormattedID: testcase.get('FormattedID')
                                                                    });
                                                    }, this);
                                                    --pendingTestCases;
                                                    if (pendingTestCases === 0) {
                                                        this._createTestSetGrid(testSets);
                                                    }
                                                },
                                                scope: this
                                            });
                            testSets.push(ts);
                     },this);
                 },

                      _createTestSetGrid: function(testsets) {
                        var testSetStore = Ext.create('Rally.data.custom.Store', {
                                data: testsets,
                                pageSize: 100,  
                            });
                        if (!this.down('#testsetgrid')) {
                         this.down('#childPanel2').grid = this.down('#childPanel2').add({
                            xtype: 'rallygrid',
                            itemId: 'testsetgrid',
                            store: testSetStore,
                            columnCfgs: [
                                {
                                   text: 'Formatted ID', dataIndex: 'FormattedID', xtype: 'templatecolumn',
                                    tpl: Ext.create('Rally.ui.renderer.template.FormattedIDTemplate')
                                },
                                {
                                    text: 'Test Case Count', dataIndex: 'TestCaseCount',
                                },
                                {
                                    text: 'Test Case Status', dataIndex: 'TestCaseStatus',flex:1
                                },
                                {
                                    text: 'TestCases', dataIndex: 'TestCases',flex:1, 
                                    renderer: function(value) {
                                        var html = [];
                                        Ext.Array.each(value, function(testcase){
                                            html.push('<a href="' + Rally.nav.Manager.getDetailUrl(testcase) + '">' + testcase.FormattedID + '</a>')
                                        });
                                        return html.join(', ');
                                    }
                                }
                            ]
                        });
                         }else{
                            this.down('#childPanel2').grid.reconfigure(testSetStore);
                         }
                    }
    });

              Rally.launchApp('CustomApp', {
                    name:"Stories and TestSets by Release",
                    //parentRepos:""
                });

            });
        </script>

        <style type="text/css">
    .app {
         /* Add app styles here */
    }

    .panel{
        left: 15%
    }

        </style>

    </head>
    <body></body>
    </html>
于 2013-10-02T15:40:14.913 回答