1. 程式人生 > >QC API全系列揭祕之Test Execution操作(全網首發)

QC API全系列揭祕之Test Execution操作(全網首發)

(原創文章,轉載請註明出處。)

一、QC簡介:

        Quality Center存在至今已經走過了10多個年頭,名字從一開始的TD,到後來的QC,再到現在的ALM。所屬公司從開始的Mercury到現在的HP,核心一直沒變,變的只有名字。隨著Mercury最核心的高層、架構師和專家的離開,現在每每的升級都帶來諸多失望,再也沒有當初使用Mercury工具的時候那樣心潮澎湃,看看QC,看看QTP,不多言語。如果能夠堅持做好的話,現在哪有TestLink、哪有禪道什麼事。然而,QC框架的設計核心,拿到現在來看,依然是測試管理框架的主流。QC設計思路簡單清晰,從測試需求到測試用例,再到執行測試用例、提交缺陷、跟蹤缺陷,整個過程清晰且易於理解,時至今日,依然被廣泛沿用。(微信公眾號“詩澤園”)

二、寫作目的:

        寫此係列的目的,不是為了情懷,而是為了將QC介面的呼叫方式整理成冊。一來是為了通過對QC介面呼叫的理解,去更深入的理解測試框架的概念(當然僅僅包含小部分);二來是為了通過二次開發,解決QC使用過程中的諸多不便。

三、解決問題:

QC當前存在以下問題:

1、需求或用例的匯入匯出依然不完善。之前就寫過一個工具解決這個問題:https://download.csdn.net/download/yoyoalphax/4441588,但近期依然常有人催促我更新版本,之後會專門發一篇關於用例樹解析的圖文。(網上資料大部分需要admin賬戶通過後臺SQL做關鍵字篩選獲得結果,但事實上與實際的匯入匯出過程有所出入。)

2、用例執行順序需要參考已有用例集,無法隨心所欲變化。

3、每次執行的用例集列表無法儲存並複用。

4、手動執行前需要處理解鎖等額外步驟。

5、測試結果隨有統一展示,但需要人工收集結果等等。

四、本文重點:
        本文著重介紹Test Execution部分,解決了以上羅列的後幾個問題,併為某些問題提供解決的條件。其餘需求樹、用例樹讀取及寫入部分以後再介紹。
        Test Execution屬於自動化測試框架的一部分,我們先從框架說起。
        框架的概念:


        測試框架的話題,範圍實在是太大了,我們還是圍繞QC來說。我們僅僅考慮從測試用例的編寫、測試用例的執行和測試報告來看。用過的同學都清楚,TestPlan裡可以存放測試用例,而TestLab裡可以建TestSet並形成用例集並且執行,Report裡檢視用例,這就是基本流程。而對於自動化測試的流程而言,用QC的方式又有所區別:首先,是測試工具的關聯。QC需要安裝QTP或LR的外掛,使得QC的測試執行模組裡可以識別這兩類程式碼。又或者你用的是其他第三方工具或用JAVA和.Net自開發的測試工具,那你需要用VB6編寫關聯指令碼,使得QC能夠呼叫你寫的程式碼,這個過程我們不在本文中討論。其次,是測試指令碼的儲存。以用例的形式儲存在TestPlan裡,最終落到QC的後臺SQL資料庫裡,並能實現指令碼與資料的分開儲存。再者是測試用例集的構成,這部分是放在TestLab裡去管理。按照業務邏輯,將已有用例歸集並排序,形成業務邏輯並儲存。最後是測試執行,按照被測系統版本、範圍,選擇相應的業務節點去觸發執行,獲得結果。

        這個過程其實分兩個階段,一個是測試開發階段,另一個是測試執行階段,兩個階段各有各的自動化設計方面的考慮。這個不是本文的主旨,但是我也順便捋一下,加深理解。測試開發階段,其實是要設計出狹義的測試框架,也就是一個可以團隊合作開發的測試指令碼的模式,包含底層庫、業務的封裝、上層呼叫及斷言等等。有了狹義的框架後,需要有偏業務的測試人員介入,將測試指令碼歸集形成測試集。在測試開發階段,往往這兩塊是一同進行的,邊改邊拼接。測試Q執行階段,其實是要有測試執行框架去支撐的,尤其是有大批量的測試指令碼和測試機需要團隊去匹配執行時,這個框架就顯得尤為重要。其中涉及到的關鍵點,如待測範圍的選擇及儲存、測試機的管理(vmware or docker)、用例執行時的動態分配、異常處理、報告收集等等。

        本文所涉及的內容應該是通過QC實現自動化測試指令碼執行的前提下,實現測試範圍的選擇與儲存,測試指令碼的自動化執行並做後續的報告收集工作。

五、QC介面規範:
        具體的介面規範你可以嘗試通過百度查詢“QC OTA”或者“QC物件模型”,獲得介面說明及使用規範。但以下的核心程式碼均是本人鍵盤手打敲擊而成,尤其是核心的業務樹生成及測試執行部分,均為首次釋出。還望轉載或程式碼複用時註明出處。(出自微信公眾號“詩澤園”或部落格園“朝花夕拾”)

六、QC介面操作Test Execution:

正式切入正題:

定義全域性變數

真實程式碼中有很多控制類及展示類,都已經去除了。這裡只展示核心程式碼。

1        TDConnection tdc = new TDConnection();
2        TDAPIOLELib.TSScheduler QCscheduler;
3        //用於最終真實啟動用例及監測執行結果
4        TDAPIOLELib.ExecutionStatus QCexecutionStatus;
5        //用於反饋執行結果及做結果的動態重新整理
6        List QClistForTSTest;

QC伺服器連線、登入(身份驗證)及專案連線

伺服器連線為初始化連線,好比你剛登入QC終端時它給你的反饋。一般會碰到要你reload ActiveX或者OTA初始化失敗之類的錯誤。處理方法是把QC快取資料夾刪除,再訪問,讓其重新reload。這塊程式碼裡會有處理,但這類程式碼就不貼了。

 1        //初始化連線
2        private void InitConnect(string serverName)
3        
{
4            try
5            {
6                if ((tdc.Connected == false) || (tdc.Connected == true && tdc.ServerName != serverName))
7                    tdc.InitConnectionEx(serverName);
8            }
9            catch (Exception ex)
10            {
11                Console.WriteLine(ex.ToString());
12                MessageBox.Show("Server Error""Warning");
13            }
14        }
15
16        //身份驗證
17        private void GetAuthenticate(string userName, string passWord)
18        
{
19            try
20            {
21                tdc.Login(userName, passWord);
22                TDAPIOLELib.List projectList = tdc.get_VisibleProjects(tdc.VisibleDomains[1].ToString());
23                //VisibleDomains[1]為專案列表中的第一個Domain,多的話自行處理
24                for (int i = 1; i <= projectList.Count; i++)
25                {
26                    projectsBox.Items.Add(projectList[i]);
27                    //將Domain下所有專案讀取出來,以備後用
28                }            
29            }
30            catch (Exception ex)
31            {
32                Console.WriteLine(ex.ToString());
33                MessageBox.Show("Please check the User Name is correct or not.""Warning");
34            }
35        }
 1        //專案連線
2        private void LoginButton_Click(object sender, EventArgs e)
3        
{
4            try
5            {
6                string ProjectName = projectsBox.SelectedItem.ToString();
7                tdc.Connect(tdc.VisibleDomains[1].ToString(), ProjectName);
8
9                //呼叫生成業務樹程式碼,也可以不在此處呼叫
10                Thread td_tree = new Thread(new ThreadStart(this.CreateTreeView));
11                td_tree.Start();
12            }
13            catch (Exception ex)
14            {
15                Console.WriteLine(ex.ToString());
16                MessageBox.Show("Please choose the project.""Warning");
17            }
18        }

重點之一:遞迴生成業務樹

同樣需要新開執行緒呼叫,先生成根節點,再遞迴生成業務樹

 1        //生成根節點並呼叫遞迴樹
2        private void CreateTreeView()
3        
{
4            try
5            {
6                TreeNode mainNode = new TreeNode();
7                mainNode.Name = "Root";
8                mainNode.Text = "Root";
9                Add_TreeRoot(mainNode);
10
11                SysTreeNode test_folder;
12                TestSetFactory globalTestSetFactory;
13                List l_List;
14                TreeNode r_node = new TreeNode();
15
16                int nodeCount;
17                nodeCount = qcProjectTree.GetNodeCount(true);
18                TreeNode[] r_nodeArray = new TreeNode[10000];
19                r_nodeArray = qcProjectTree.Nodes.Find("Root"false);
20                r_node = r_nodeArray[0];
21
22                TestSetTreeManager tm;
23                tm = (TDAPIOLELib.TestSetTreeManager)tdc.TestSetTreeManager;
24                test_folder = (TDAPIOLELib.SysTreeNode)tm.Root;
25                globalTestSetFactory = (TDAPIOLELib.TestSetFactory)tdc.TestSetFactory;
26                l_List = globalTestSetFactory.NewList("");
27                recursiveTreeBuilder(test_folder, r_node);
28            }
29            catch (Exception ex)
30            {
31                Console.WriteLine(ex.ToString());
32            }
33        }
34
35        //遞迴生成業務樹
36        private bool recursiveTreeBuilder(TDAPIOLELib.SysTreeNode folder, TreeNode parent)
37        
{
38            TDAPIOLELib.List folders, tests;
39            TDAPIOLELib.TestSetFactory objTestSetFactory;
40            TDAPIOLELib.TestSetFolder objTSFolder;
41            TreeNode n;
42            try
43            {
44                folders = folder.NewList();
45                foreach (TDAPIOLELib.SysTreeNode f in folders)
46                {
47                    TreeNode nodeChild = new TreeNode();
48                    nodeChild.Name = f.Name;
49                    nodeChild.Text = f.Name;
50                    nodeChild.ImageIndex = 0;
51                    Add_TreeNode(parent, nodeChild);
52                    n = parent.Nodes[nodeChild.Name];
53                    recursiveTreeBuilder(f, n);
54                }
55
56                objTSFolder = (TDAPIOLELib.TestSetFolder)folder;
57                if (objTSFolder.NodeID != 0)
58                {
59                    objTestSetFactory = (TDAPIOLELib.TestSetFactory)objTSFolder.TestSetFactory;
60                    tests = objTestSetFactory.NewList("");
61                    foreach (TDAPIOLELib.TestSet testSet in tests)
62                    {
63                        TreeNode nodeChild1 = new TreeNode();
64                        nodeChild1.Name = testSet.ID.ToString();
65                        nodeChild1.Text = testSet.Name;
66                        nodeChild1.ImageIndex = 1;
67                        Add_TreeNode(parent, nodeChild1);
68                        n = parent.Nodes[nodeChild1.Name];
69                        n.Tag = objTSFolder.Path + @"\" + testSet.Name;
70                    }
71                }
72                return true;
73            }
74            catch (Exception ex)
75            {
76                Console.WriteLine(ex.ToString());
77                return false;
78            }
79        }

以下程式碼用委託的方式生成節點,保證在業務樹生成過程中可隨時點選並保證介面不出現假死(跟業務樹生成無直接關係,可忽略)

 1        delegate void Add_Node(TreeNode parent, TreeNode node);
2        private void Add_TreeNode(TreeNode parent, TreeNode node)
3        
{
4            if (

相關推薦

QC API系列揭祕Test Execution操作全網首發

(原創文章,轉載請註明出處。) 一、QC簡介:         Quality Center存在至今已經走過了10多個年頭,名字從一開始的TD,到後來的QC,再到現在的ALM。所屬公司從開始的Mercury到現在的HP,核心一直沒變,變的只有名字。隨著Me

資料結構連結串列操作c++實現

1、單向連結串列(頭結點不含資料,不佔長度),C++實現: #include <iostream> #include <stack> using namespace std; /*****定義節點****/ typedef struct node{ int va

線性表順序表操作已完結

考研408資料結構線性表複習;有任何問題私我#include<iostream> #include<algorithm> const int initlength = 100; ///順序表的初始長度 using namespace std

Express系列教程(三):get傳參

listen mit for 發送 query 系列教程 系列 真的 bsp 一、關於get請求 一般在網站開發中,get都用作數據獲取和查詢,類似於數據庫中的查詢操作,當服務器解析前臺資源後即傳輸相應內容;而查詢字符串是在URL上進行的,形如: http://loca

Express系列教程(五):Express的中間件

lur 操作系統 outer The scrip option public 說明 .get 一、中間件 從字面意思,我們可以了解到它大概就是做中間代理操作,事實也是如此;大多數情況下,中間件就是在做接收到請求和發送響應中間的一系列操作。事實上,express是一個路由和

Express系列教程(七):cookie的加密

fun return 部分 ror 重新 provided 取出 ole 底層 一、關於cookie加密 cookie加密是讓客戶端用戶無法的值cookie明文信息,是數據安全的重要部分;一般的我們可以在保存cookie時對cookie信息進行加密,或者在res.cook

Express系列教程(九):將session上傳至mysql數據庫

brush l數據庫 inf port module ava 一個 coo oca 一、簡介 實際引用中,有些公司在不同地區會設置不同服務器,因此就需要用到nginx以實現負載均衡,這時,將session數據保存至數據庫就成為了需要面對的問題,我們以MySQL數據庫為例,

Express系列教程(十):jade模板引擎

語法 前言 const ews 並且 如果 () handle 轉換 一、前言 隨著前端業務的不斷發展,頁面交互邏輯的不斷提高,讓數據和界面實現分離漸漸被提了出來。JavaScript的MVC思想也流行了起來,在這種背景下,基於node.js的模板引擎也隨之出現。 什麽

git系列1安裝初體驗windows

conf pan cnblogs it管理 png 下一步 rac -1 stage 1.百度雲盤地址 https://pan.baidu.com/s/1o8vAt78 2.下載後雙擊直接下一步下一步即可 3.創建一個目錄,並在目錄中創建文件README.CD 4.

Openstack 安裝部署指南翻譯系列 Cinder服務安裝Block Storage

openstack 翻譯 cinder安裝1.1.1.1. Cinder服務安裝(Block Storage)塊存儲服務(cinder)為訪客實例提供塊存儲設備。存儲設置方法由塊存儲驅動程序確定,或者在多後端配置的情況下確定驅動程序。有各種可用的驅動程序:NAS / SAN,NFS,iSCSI,Ceph等。塊

棧開發HTML快速入門

ack enter 提示 其他 red tle 顯示圖片 val password 一、HTML 是什麽? HTML 指的是超文本標記語言 (Hyper Text Markup Language) HTML 不是一種編程語言,而是一種標記語言 (markup lan

Silverlight & Blend動畫設計系列十三:三角函數Trigonometry動畫飄落的雪花Falling Snow

4.2 函數 produced end amp war handler 代碼 alex 平時我們所看到的雪花(Falling Snow)飄飄的效果實際上也是一個動畫,是由許多的動畫對象共同完成的一個界面效果。對於不同大小的雪片可以通過縮放變換(ScaleTransform)

UIPath入門系列數據操作

variables not mil 增加 變量類型 ctrl 種類 有一種 src 今天講解的是UIPath的數據操作 一、UIPath的數據類型有一下四種 1) Scalar Variables標量:字符,布爾值,數字或者日期類型 2) Collections集合:數組,

Python棧開發文件操作

開始 文件的 只讀 示例 col remove code 上下文 adl No.1 文件的概念 文件的概念和作用 計算機中的文件,就是存儲在某種長期儲存設備上的一段數據流 計算機中的文件,可以在需要的時候使用 文件的存儲方式 文本文件 可以使用文本編輯器查看 本質上還是二

springboot2.0x系列一springboot2.0x整合ActiveMQ簡單整合與應用

ActiveMQ ActiveMQ 是Apache出品,最流行的,能力強勁的開源訊息匯流排。ActiveMQ 是一個完全支援JMS1.1和J2EE 1.4規範的 JMS Provider實現,儘管JMS規範出臺已經是很久的事情了,但是JMS在當今的J2EE應用中間仍然扮演著特殊的地位。 特性 多種語

ES6系列_16模組化操作

ES6的模組化操作主要包括兩個方面。 (1)export :負責進行模組化,也是模組的輸出。 (2)import : 負責把模組引,也是模組的引入操作。 export的用法: export可以讓我們把變數,函式,物件進行模組化,提供外部呼叫介面,讓外部進行引用。先來看個最簡單的例子,把一個變數模組化。

centos7下Hadoop2.8.4分佈搭建HDFS叢集搭建

1)搭建前的準備 注意:(以下操作可以先配置一臺,然後通過scp命令傳送到其他兩臺虛擬機器上 傳送到其他機器 scp -r 主機名: 注意:載入環境變數 source /etc/profile

前端非同步程式設計系列Promise/Deferred模式3/4

在這篇文章中,我會介紹另外一種非同步程式設計的解決方案:Promise/Deferred模式。這種模式最早出現於Dojo的程式碼中,09年被Kris Zyp抽象為一個提議草案,釋出於CommonJS規範中,並抽象出Promise/A、Promise/B、Promise/D這樣典型的非同步Promis

MySQL 系列連載 XtraBackup 備份原理1

導讀 在日常的linux運維工作中,大資料量備份與還原,始終是個難點。關於mysql的備份和恢復,比較傳統的是用mysqldump工具,今天本文推薦另一個備份工具innobackupex。 如果您在本文遇到任何問題或疑問請到QQ群中與我們交流。也可在下方進行評論。我將在第一時間和您進行交流,共同學習

FreeRTOS配置項詳解、裁剪FreeRTOSConfig.h

簡介   首先,我們需要明確一個問題,FreeRTOSConfig.h是一個使用者級別的檔案,不屬於核心檔案。每個使用者可以有不同的FreeRTOSConfig.h。   FreeRTOS作為一個可高度配置的實時核心,其絕大多數配置選項都體現在FreeRTO