项目脚本示例

此部分提供一些示例供您参考,以帮助您编写自己的项目脚本。

在本主题中︰

示例:自定义新建缺陷对话框中的字段

此示例显示如何自定义“新建缺陷”对话框中的字段布局和其他字段属性。可创建相似的代码来排列“缺陷详细信息”对话框的布局。

此示例包括以下示例函数:

  • SetFieldApp 函数。接收字段名及其属性作为参数,并将属性分配到字段。

    Bug_SharedFunction 事件中添加以下代码。它分配以下字段属性: 字段可见性、字段是否必填、要显示该字段的页面 (选项卡) 数和视图顺序 (从左到右,从上到下)。

    Copy code
    function SetFieldApp(fieldName, Vis, Req, PNo, VOrder){
        var bugfield = Bug_Fields(fieldName);
        bugfield.IsVisible = Vis;
        bugfield.IsRequired = Req;
        bugfield.PageNo = PNo;
        bugfield.ViewOrder = VOrder;
        console.log("SetFieldApp");
    }
  • FieldCust_AddDefect 函数。在“新建缺陷”对话框中对每个字段调用 SetFieldApp 函数,以设置字段的属性。对某些字段,FieldCust_AddDefect 检查当前用户所属的用户组,并相应地自定义字段属性。Bug_New 事件过程中有对 FieldCust_AddDefect 的调用。

    • Bug_New 事件中,添加以下示例代码以处理对所有用户组通用的字段。它只对特定用户组或针对不同用户有不同属性的用户组,为对话框中显示的字段使用条件语句。

      JavaScript 示例:

      Copy code
      function FieldCust_AddDefect()
      {
          // Initialize the fields of the defect 
          for (var i= 0; i<= Bug_Fields.Count -1; i++)
          {
              SetFieldApp(Bug_Fields.FieldById(i).FieldName, false, false, 100, 0);
          }
          var ViewNum = 0;
          var PageNum = 0;
          // Set fields that are in common for all user groups 
          SetFieldApp("BG_DESCRIPTION", true, false, PageNum, ViewNum);
          ViewNum = ViewNum + 1;
          SetFieldApp("BG_SUMMARY", true, true, PageNum, ViewNum);
          ViewNum = ViewNum + 1;
          SetFieldApp("BG_DETECTED_BY", true, true, PageNum, ViewNum);
          ViewNum = ViewNum + 1;
          SetFieldApp("BG_DETECTION_DATE", true, true, PageNum, ViewNum);
          ViewNum = ViewNum + 1;
          SetFieldApp("BG_DETECTION_VERSION", true, true, PageNum, ViewNum);
          ViewNum = ViewNum + 1;
          SetFieldApp("BG_SEVERITY", true, true, PageNum, ViewNum);
          ViewNum = ViewNum + 1;
          SetFieldApp("BG_PRIORITY", true, true, PageNum, ViewNum);
          ViewNum = ViewNum + 1;
          SetFieldApp("BG_PROJECT", true, false, PageNum, ViewNum);
          ViewNum = ViewNum + 1;
          SetFieldApp("BG_REPRODUCIBLE", true, false, PageNum, ViewNum);
          ViewNum = ViewNum + 1;
          SetFieldApp("BG_STATUS", true, false, PageNum, ViewNum);
          ViewNum = ViewNum + 1;
          // Set fields that are different for different user groups. 
          // Since one user can belong to multiple user groups, 
          // or none of these groups, there is no need for an Else statement.
          if (User.IsInGroup("Developer"))
          {
             SetFieldApp("BG_PLANNED_CLOSING_VERSION", true, false, PageNum, ViewNum);
             ViewNum = ViewNum + 1;
             SetFieldApp("BG_PLANNED_FIX_TIME", true, false, PageNum, ViewNum);
             ViewNum = ViewNum + 1;
          }
        
          if (User.IsInGroup("QATester")) 
          {
             PageNum = PageNum + 1;
             SetFieldApp("BG_USER_01", true, false, PageNum, ViewNum);
             ViewNum = ViewNum + 1;
             SetFieldApp("BG_USER_02", true, false, PageNum, ViewNum);
             ViewNum = ViewNum + 1;
          }
          
          SetFieldApp("BG_ACTUAL_FIX_TIME", true, false, PageNum, ViewNum);
          ViewNum = ViewNum + 1;
          // ...
          console.log("FieldCust_AddDefect");
    • Bug_New 事件过程中添加对 FieldCust_AddDefect 的调用,这样用户添加新缺陷时将触发它:

      JavaScript 示例:

      Copy code
      function Bug_New() {
          FieldCust_AddDefect();
      }

返回页首

示例:阻止用户执行操作

此示例演示如何阻止用户在特定情况下执行操作。

如果缺陷状态为“新建”,则该代码会阻止用户删除缺陷。

将以下代码添加到 ActionCanExecute 事件过程,这样用户试图执行操作时将执行检查。

Copy code
function ActionCanExecute(actionName) {
   if (actionName === 'Defects.DeleteDefect') {
     if (Bug_Fields("BG_STATUS").Value === 'New') {
        MsgBox('Defect with New status cannot be deleted.');
        return false;
      }  
    }
    return true;
 }

返回页首

示例:更改实体详细信息对话框的选项卡名称

此示例演示如何在“新建缺陷”对话框中自定义选项卡名称。此示例将选项卡设置为 GeneralEnvironmentsBusiness Case

将以下 JavaScript 代码添加到 Defects_GetDetailsPageName 事件过程,此过程在 ALM 打开“新建缺陷”对话框之前触发。

Copy code
function GetDetailsPageName(pageName, pageNum) {
    if (ActiveDialogName === "New Bug") {
        var detailsPageName;
        switch (pageNum) {
            case 1
                detailsPageName = "General";
                break;
            case 2
                detailsPageName = "Environments";
                break;
            default
                detailsPageName = "Business Case";
                break;
        }
        return detailsPageName;
    }
}

返回页首

示例:将模板添加到备注字段

可以用项目脚本将默认模板添加到备注字段。此示例将文本添加到用户定义的备注字段 BG_USER_25,以在添加缺陷时显示模板。

将以下 JavaScript 代码添加到 Bug_New 事件过程:

Copy code
    function Bug_New() {
        Bug_Fields("BG_USER_25").Value = "<html><body><b>Step by step scenario:</b>" + "<br><br><br><b>How it affects the user:</b></body></html>";
        console.log("Bug_New");
    }

返回页首

示例:更改基于用户组的字段

此示例演示如何按照输入缺陷的用户的用户来更改字段值。

在此示例中,用户定义字段 BG_USER_01 是检测模式字段,检测到缺陷的用户可以输入发现它的方式。可能的值有 Formal testingInformal testingBTW

该示例在缺陷由非 QATester 的用户打开时,将检测模式字段的值设置为 BTW。如果缺陷由 QATester 中的用户打开,则默认值设置为 Formal testing

将以下 JavaScript 代码添加到 Bug_New 事件,这样添加缺陷时就会触发它:

Copy code
    function Bug_New() {
        if (!(User.IsInGroup("QATester")))
           {
             Bug_Fields("BG_USER_01").Value = "BTW";
           }
        else
        {
          Bug_Fields("BG_USER_01").Value = "Formal testing";
        }
        console.log("Bug_New");
}

返回页首

示例:根据另一个字段来更改一个字段

此示例演示如何根据输入另一个字段的值来更改字段值。

例如,当 Category 字段设置为 UI Suggestion 时可以将缺陷分配给用户 alex_qc,当 Category 字段设置为 Security Issue 时可以将缺陷分配给用户 alice_qc

该示例假定用户定义的字段 BG_USER_05 用于存储类别。在“缺陷”模块中更改类别字段时,BG_RESPONSIBLE 字段将分配到相应值。

将以下 JavaScript 代码添加到 Bug_FieldChange 事件过程,这样用户更改缺陷的字段值时就会触发它。

Copy code
    function Bug_FieldChange(fieldName) {
        if (fieldName == "BG_USER_05") {
            switch (Bug_Fields("BG_USER_05").Value)
            {
                case "UI Suggestion"
                    Bug_Fields("BG_RESPONSIBLE").Value="alex_qc";
                    break;
                case "Security Issue"
                    Bug_Fields("BG_RESPONSIBLE").Value="alice_qc";
                    break;
                default
                    Bug_Fields("BG_RESPONSIBLE").Value="non-assigned";
            }
        }
        console.log("Bug_FieldChange");
}

返回页首

示例:字段更改时更改字段属性

此示例演示如何在更改不同字段时更改字段的属性。

在此示例中,如果缺陷的状态 (BG_STATUS) 更改为 Closed,则用户必须在字段“关闭于版本”(BG_CLOSING_VERSION) 中提供值。

将以下 JavaScript 代码添加到 Bug_FieldChange 事件过程,这样如果状态更改为 Closed,“关闭于版本”字段就为必填:

Copy code
function Bug_FieldChange(fieldName) {
    if (fieldName == "BG_STATUS")
    {
        if (Bug_Fields("BG_STATUS").Value == "Closed")
        {
            Bug_Fields("BG_CLOSING_VERSION").IsRequired=true;
        }
        else 
        {
            Bug_Fields("BG_CLOSING_VERSION").IsRequired=false;
        }
    }
    else 
    {
        // Enter your code here.;
    }
    console.log("Bug_FieldChange");
}

返回页首

示例:验证在特定情况下实体是否可以更新

此示例演示如何通过使用 CanPost 事件过程来执行所有字段的验证。例如,此代码段确保用户不能在没有添加注释的情况下拒绝缺陷。

在此示例中,用户不能将缺陷状态 (BG_STATUS) 更改为 Rejected,除非已在“注释”字段 (BG_DEV_COMMENTS) 中输入了一些解释文本。

将以下 JavaScript 代码添加到 Bug_CanPost 事件,这样用户试图拒绝缺陷时将执行检查。

Copy code
    function Bug_CanPost() {
        // Initialize the function's return value to avoid unpredictable behavior.
        var Bug_CanPost = false;
        if (Bug_Fields("BG_STATUS").IsModified && Bug_Fields("BG_STATUS").Value == "Rejected" &&  !(Bug_Fields("BG_DEV_COMMENTS").IsModified))
        {
            Bug_CanPost = false;
            MsgBox("You must enter a comment when rejecting a defect.");
            return Bug_CanPost;
        }  
        else
        {
            Bug_CanPost = true;
            return Bug_CanPost;
        }     
        console.log("Bug_CanPost");
}

返回页首

示例:验证字段

此示例演示如何验证单个字段值。例如,以下代码段显示如何确保特定中的用户无法降低缺陷的优先级。

在此示例中,如果用户在 QATester 中,且正在更新 BG_PRIORITY 字段,则 BG_PRIORITY 字段的新值不能小于当前值。

此示例假定在项目的优先级字段列表中,以升序对值排序时,较低的优先级在前。例如,如果元素如下,则列表符合此需求:1 - 低,2 - 中,3 - 高

将以下 JavaScript 代码添加到 Bug_FieldCanChange 事件过程,这样用户试图更改缺陷字段值时就会触发它。

Copy code
function Bug_FieldCanChange(fieldName, newValue) {
   // Initialize the function's return value to avoid unpredictable behavior.
   var Bug_FieldCanChange = true;
   if (User.IsInGroup("QATester") && fieldName == "BG_PRIORITY"
      {
          if (newValue < Bug_Fields("BG_PRIORITY").Value) 
             { 
                Bug_FieldCanChange = false;
                MsgBox("You do not have permission to lower " + "defect priority.");
                return Bug_FieldCanChange;
              }
              else
              {
                Bug_FieldCanChange = true;
                return Bug_FieldCanChange;
              }
      }
    else
      {
      // Enter your code here.
      }       
    console.log("Bug_FieldCanChange");                
}

返回页首

示例:呈现动态字段列表

此示例演示如何根据另一个字段的值,在字段中呈现不同的字段列表。

用户定义的函数 SW_SetLists_Environment 会检查环境规范字段 (BG_USER_02) 的值,并将相应字段列表分配到环境类型字段 (BG_USER_01)。

此示例假定字段列表已在项目中定义。有关详细信息,请参阅自定义字段列表

  • 将以下 JavaScript 代码添加到 Bug_MoveTo 事件过程,这样用户在缺陷模块中更改聚焦对象时,就会调用用户定义的函数 SW_SetLists_Environment

    Copy code
    function Bug_MoveTo() {
        SW_SetLists_Environment();
        console.log("Bug_MoveTo");
    }
  • 将以下 JavaScript 代码添加到 Bug_FieldChange 事件过程,这样用户在“缺陷”模块中更改“环境类型”字段 (BG_USER_01) 的值时,就会调用用户定义的函数 SW_SetLists_Environment

    Copy code
    function Bug_FieldChange(fieldName) {
        if (fieldName  == "BG_USER_01")
        {
            SW_SetLists_Environment();
        }
        else
        {
            // Enter your code here.
        }
        console.log("Bug_FieldChange");
    }
  • 用户定义的函数 SW_SetLists_Environment 会检查环境规范字段 (BG_USER_02) 的值,并将相应字段列表分配到环境类型字段 (BG_USER_01)。

    Copy code
    function SW_SetLists_Environment() 
    {
        var listName;
        switch (Bug_Fields("BG_USER_01").Value) 
          {
                case "Browser"
                    listName = "Browsers";
                    break;
                case "Database Type"
                    listName = "Database Type";
                    break;
                case "Operating System"
                    listName = "Platform";
                    break;
                case "Web Server"
                    listName = "Web Server";
                    break;
                default
                    listName = "Environment Specification";
            }
        Bug_Fields("BG_USER_02").List = Lists(listName);
        console.log("Set Environment List");
    }

返回页首