【问题标题】:pyral deleteAttachment to delete attachment from a Test Case definition not workingpyral deleteAttachment 从测试用例定义中删除附件不起作用
【发布时间】:2020-01-25 11:04:15
【问题描述】:

我正在尝试使用 pyral 从 Rally 上的测试用例定义中删除附件:

del_attachment = rally.deleteAttachment('TestCase',filename)

任何建议,出了什么问题?

【问题讨论】:

    标签: python devops rally pyral


    【解决方案1】:

    如果您查看pyralcode,您会得到以下签名:

      def deleteAttachment(self, artifact, filename):
            """
                Still unclear for WSAPI v2.0 if Attachment items can be deleted.
                Apparently AttachmentContent items can be deleted.
            """
            art_type, artifact = self._realizeArtifact(artifact)
            if not art_type:
                return False
    
            current_attachments = [att for att in artifact.Attachments]
            hits = [att for att in current_attachments if att.Name == filename]
            if not hits:
                return False
    
            ...
    

    所以第一个参数是一个工件(即测试用例对象),而不是一个字符串。

    可能应该是这样的:

    import logging
    
    logging.basicConfig(format="%(levelname)s:%(module)s:%(lineno)d:%(msg)s")
    
    
    try:
        # Get number of existing steps
        testcase = rally.get("TestCase", query="FormattedID = %s" % tcid, instance=True)
        has_been_deleted = rally.deleteAttachment(testcase, filename)
        if not has_been_deleted:
            msg = "Attachment '{0}' of Test Case {1} not deleted successfully"
            logging.warning(msg.format(filename, testcase.FormattedID))
    
    except RallyRESTAPIError as e:
        logging.error("Error while deleting attachment '{0}': {1}".format(filename, e))
    

    【讨论】:

      【解决方案2】:

      传递工件的 FormattedID 字符串应该可以工作,因为 pyral 会尝试识别工件的类型并在下面的调用中为您检索它..

              art_type, artifact = self._realizeArtifact(artifact)
      

      看看 _realizeArtifact 的代码...

          def _realizeArtifact(self, artifact):
          """
              Helper method to identify the artifact type and to retrieve it if the 
              artifact value is a FormattedID. If the artifact is already an instance
              of a Rally entity, then all that needs to be done is deduce the art_type
              from the class name.  If the artifact argument given is neither of those 
              two conditions, return back a 2 tuple of (False, None).
              Once you have a Rally instance of the artifact, return back a 
              2 tuple of (art_type, artifact)
          """
          art_type = False
          if 'pyral.entity.' in str(type(artifact)):
              # we've got the artifact already...
              art_type = artifact.__class__.__name__
          elif self.FORMATTED_ID_PATTERN.match(artifact): 
              # artifact is a potential FormattedID value
              prefix = artifact[:2]
              if prefix[1] in string.digits:
                  prefix = prefix[0]
              art_type = self.ARTIFACT_TYPE[prefix]
              response = self.get(art_type, fetch=True, query='FormattedID = %s' % artifact)
              if response.resultCount == 1:
                  artifact = response.next()
              else:
                  art_type = False
          else: # the supplied artifact isn't anything we can deal with here...
              pass
      
          return art_type, artifact
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-11-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多