前言:

  我使用TD时间也不是非常长,和牛人相比那是天壤之别!只是我有幸配置TD。相信不是哪么多人员有这种锻炼的机会!

  在我配置的过程中,发现关于流(workflow)的资料非常之少,给我配置起来带来了很大时间上的浪费。可是工作流却是TD功能宽度和自定义级别最大的,如果不学会来使用,TD很多应该能实现的功能都可能大打折扣或者不能使用。当然,本着对初学者和不太懂的人以借鉴的思想,我尽量写的简便通俗易懂点

  一、基础篇:

  为了能够更好的开始讲解工作流,我先说明些东西。这些内容是基础。请耐心看,如果你已经知道可以跳过。

  1.作流其实就是TD中提供的一种可以达到编程效果的一个编辑器。我们可以直接编辑脚本,不用单独编译。

  2.工作流脚本是使用VB语言编写的,所以它支持如msgbox类的输入输出函数。

  3.您需要明确知道你想在什么时候执行你的脚本。比如Defects_Bug_New里面的语句只在你新建缺陷的时候执行,时候是不执行的。

  再比如Defects_Bug_FieldChange就是在缺陷内容发生改变了的时候执行的语句。

  4.一般默认的东西我们不要乱作修改。如:

Sub Defects_Bug_FieldChange(FieldName)
    On Error GoTo 0
End Sub

  这些内容我们就要保留。

  5.同样的Sub可以存在多个,也就是说如Sub Defects_Bug_FieldChange(FieldName)这样的函数我们可以编写几个,不必要修改系统原来的Sub Defects_Bug_FieldChange(FieldName)

  6.文中提到的,TD数据库中使用的字段(如BG_BUG_ID)。是那里来的?

  它是在你需要输入USER ID和Password那个页面(/start_a.htm),右上角有个叫CUSTOMIZE的链接,点击下,用admin用户登陆,在“Customize Project Entities” -> “DEFECT”里面的System Fields或者User Fields里面随便选择一个字段,右边查看里面“Field Name”后面的就是中使用的字段了的名字了。比如你选择Subject,对应的Field Name就是BG_SUBJECT.

  7.工作流中的GoTo语句不能像VB里面那样使用。因为标签是无效的。

  8.理论上来讲,TD中的大部分功能东西都能通过这里编辑,比如按钮。事件。当然前提是你够熟悉。

  9.如果要脚本起作用,只要退出再登陆进TD.脚本就会立刻起作用。

  二、工作流的实践一 ——新建缺陷时候的默认值

  需求说明:我们在打开添加缺陷的页面的时候(特别是使用了自定义字段的时候)我们最希望的就是给这些不是非常重要的,但是又不希望没有内容的字段,有些默认值。哪么我们第一个来做的就是这个需求。请先看代码。

Sub Defects_Bug_New
     On Error Resume Next
         Bug_Fields("BG_DETECTION_VERSION").Value = "Ehome 2.0"
  On Error GoTo 0
 End Sub

  这段代码,你只要复制到工作流脚本中去,哪么你在添加缺陷的时候,版本这个字段里面就会自动有一个内容Ehome 2.0。这段代码中的Defects_Bug_New代表新建缺陷的时候执行的脚本,Bug_Fields("BG_DETECTION_VERSION")具体缺陷字段。这是最简单的工作流脚本了。你明白了没有?

-------------------------------------------------------------------------------------------------

 

三、工作流的实践二 ——记录修改人和修改时间

  需求说明:我们希望在开发修改了一个缺陷的状态为“修改完成“的时候,记录下修改他的人,和修改时间。方便我们管理。同样,请先看代码:

Sub Defects_Bug_FieldChange(FieldName)
    On Error Resume Next
    if FieldName = "BG_STATUS" Then
        if Bug_Fields("BG_STATUS").Value = "P1-修改完成待验证" then
            Bug_Fields("BG_RESPONSIBLE").Value = User.UserName
            Bug_Fields("BG_USER_02").Value = now()
        end if
    end if
    On Error GoTo 0
End Sub

  这段代码内容就多了几行,里面Defects_Bug_FieldChange(FieldName)代表的是缺陷字段发生改变的时候执行的语句。里面的BG_STATUS代表缺陷状态,BG_RESPONSIBLE代表负责人(Syestem Fields表里的),BG_USER_02代表用户自定义字段(User Fields里的)。User.UserName代表当前操作的用户名,now()代表当前时间。剩下的东西就很容易看懂了吧。

  三、工作流的实践三 ——不修改我的缺陷必须说理由

  需求说明:有时候开发很懒,不喜欢写说明,哪么对我们测试来说,没有任何说明就返回我们。使我们很不好处理问题。哪么我们希望当程序员如果修改缺陷状态为”不修改””遗留”的时候,让程序员必须输入说明。

Sub Defects_Bug_FieldChange(FieldName)
    On Error Resume Next

    dim i
    i=""
    msg1 ="遗留或不修改此缺陷需要输入说明!"
    title1 ="输入说明"

     If FieldName = "BG_STATUS" Then
         if (Bug_Fields("BG_STATUS").Value = "P2-待遗留" or Bug_Fields("BG_STATUS").Value = "P3-暂时不修改") and Bug_Fields("BG_DEV_COMMENTS").Value = "" then
             do
                 i= InputBox(msg1,title1)
                 if i="" then
                     msgbox"必须输入说明"
                 else exit do
                 end if
             loop
             Bug_Fields("BG_DEV_COMMENTS").Value = i
          end if
      end if
    On Error GoTo 0
    End Sub

  这段代码内容就稍微多了点点,并且使用了VB的函数。我就简单的说下思路吧,具体解释,只要你看懂了上面的工作流。相信这个里面的代码也不是很复杂。

  1.开始声明和定义一些需要使用的变量。和内容。

  2.判断修改的字段是不是缺陷状态(BG_STATUS)

  3.再判断修改成的内容是不是遗留或者不修改

  4.最后判断说明(BG_DEV_COMMENTS)里面是不是没有内容

  5.如果是的话,就打开输入函数输入说明(InputBox(msg1,title1))

  6.做个循环,如果没有输入说明,就提示必须输入说明(msgbox"必须输入说明")

  7.最后吧输入的内容赋值给保存说明的字段(BG_DEV_COMMENTS)

-----------------------------------------------------------------------------------------
 

涉及的代码:
'针对提交一个新缺陷进行设置
Sub Defects_Bug_New
  WizardFieldCust_Add ' Added by wizard
'设置自定义添加的字段默认不可见
    Bug_Fields.Field("Rejected Reason").IsVisible = False
'设置Priority与Severity的默认值为"2-Medium"
    Bug_Fields.Field("Priority").Value ="2-Medium"
    Bug_Fields.Field("Severity").Value ="2-Medium"
.....
'设置自定义的时间型字段值的默认值为当前时间
Bug_Fields.Field("BG_USER_07").Value=date
'设置当tester1进入系统提交缺陷时,默认的接受人员会自定义设置为developer1
    If Bug_Fields.Field("Detected By").Value ="Tester1" then Bug_Fields.Field("Assigned To").Value ="Developer1"
End Sub


'针对缺陷字段值发生改变时进行设置
Sub Defects_Bug_FieldChange(FieldName)
  On Error Resume Next


'当处理bug时,如果status字段值更改为Rejected,Rejected Reason字段显示并为必填项
  If (Bug_Fields.Field("Status").IsModified and Bug_Fields.Field("Status").Value= "Rejected") Then
     Bug_Fields.Field("Rejected Reason").IsRequired = True
     else
     End If

  On Error GoTo 0
End Sub

 


Function Defects_ActionCanExecute(ActionName)
    On Error Resume Next    dim td
    dim ReqF
    dim ReqL

'判断按钮是不是自定义得按钮...
    if ActionName = "Link_Bug_Req" then
       '弹出窗口,接受输入的需求名
       RequirementName = InputBox("Enter the Requirement Name:", "Associate Defect to Requirement")
       '如果是数字或者空则抱错
       if (IsNumeric(RequirementName)) and Len(RequirementName) > 0 then
          MsgBox "That is not a valid Requirement Name!"
          exit function
       '如果按的是确定按钮,我们首先校验数据
       elseif Len(RequirementName) > 0 then
          '创建 TDConnection对象.
          set td = TDConnection
          '创建ReqFactory对象.
          set ReqF = td.ReqFactory
          '创建ReqFactory的List对象.通过SQL校验需求名是否存在
          set ReqL = ReqF.NewList("select * from REQ where RQ_REQ_NAME='" & RequirementName & "'")
          '如果放回的需求总数为零,则表示需求不存在
          if ReqL.Count = 0 then
             MsgBox "That Requirement Name does not exist!"
             exit function
          '如果不是则把需求名放到自定义得字段中去
          else
             Bug_Fields("BG_USER_02").Value = RequirementName
          end if
          '清除对象
          set ReqL = nothing
          set ReqF = nothing
          set td = nothing
       end if
    end if
'=====================================================================================
    Defects_ActionCanExecute = Project_DefaultRes
    On Error GoTo 0
End Function