ActivePython in ALM VAPI-XP Script

Posted by julius02 on 2017-11-22 06:20

Bonjour
Je souhaite exécuter du un script Python depuis HP ALM, de la même manière que je peux exécuter du code VBS. J'ai installé ActivePython sur mon poste local, et pourtant mon script ne s'exécute pas. Le code du script se résume à un 'print("test")'. Comment faire pour exécuter le script python depuis ALM?
Merci =)


Hi,
I would like to run Python in ALM. I installed ActivePython on my local computer but the script does'nt run. The script is 'print("test")'. How can I run the python script from ALM???
Thank you =)

grahams
ActiveState Staff
Fri, 2017-11-24 11:17

I do not know how to integrate Python with HP ALM. That might be documented in the manuals for ALM. They might also be able to tell you if you must have 64-bit or 32-bit Python, and if you need Python 2.7 versus Python 3.5.

Either version of ActivePython will install the same way:
http://docs.activestate.com/activepython/2.7/get/windows/

Once you have ActivePython installed, you can test your installation with this:
http://docs.activestate.com/activepython/2.7/start/windows/

Python scripts must have a way to invoke the Python interpreter, or must be entered manually after the interpreter has been started. This is commonly done by starting Python and providing it with the filename for the Script. Eg:
python2 mypythonscript.py

julius02 | Sun, 2017-11-26 23:57

La documentation d'ALM à ce sujet se résume à mettre un lien vers ActivePython. J'ai créé un script VBS qui lance mes scripts Python mais ça n'est pas idéal... Je le joint ci-dessous si ça peut aider quelqu'un. Ce script charge les fichiers stepx.py (x: le numéro de l'étape) et les exécute.


ALM is not documented on this point, they just put a link to ActivePython ... I managed to create a VBS script wich load and run my Python script. Here it is :

FUNCTION GenererChaineArgs(CurrentTSTest)
  DIM chaineArgs
  SET aParam = CurrentTSTest
  chaineArgs=""

  SET paramValueFct = aParam.ParameterValueFactory
  SET listeparametres = paramValueFct.NewList("")

  FOR EACH param in listeparametres
        if param.ActualValue = "" then
            chaineArgs = chaineArgs & " --" & Trim(param.Name) & " """ & preparerString(RemoveHTML(param.DefaultValue)) & """"
        else
            chaineArgs = chaineArgs & " --" & Trim(param.Name) & " """ & preparerString(RemoveHTML(param.ActualValue))  & """"
        end if

  NEXT

  GenererChaineArgs=chaineArgs
END FUNCTION

'Supprime les sauts de lignes et les espaces avant et après les mots
FUNCTION preparerString(chaine)
         preparerString=Trim(replace(replace(chaine,vbCrLf," ")," "," "))
END FUNCTION

' ----------------------------------------------------
' Main Test Function
' Debug - Boolean. Equals to false if running in [Test Mode] : reporting to Application Lifecycle Management
' CurrentTestSet - [OTA COM Library].TestSet.
' CurrentTSTest - [OTA COM Library].TSTest.
' CurrentRun - [OTA COM Library].Run.
' ----------------------------------------------------
Sub Test_Main(Debug, CurrentTestSet, CurrentTSTest, CurrentRun)
  ' *** VBScript Limitation ! ***
  ' "On Error Resume Next" statement suppresses run-time script errors.
  ' To handle run-time error in a right way, you need to put "If Err.Number <> 0 Then"
  ' after each line of code that can cause such a run-time error.
  On Error Resume Next
  DIM chainearguments

  ' clear output window
  TDOutput.Clear

  chainearguments = GenererChaineArgs(CurrentTSTest)
  Set fso = CreateObject("Scripting.FileSystemObject")
  Set shl = CreateObject("WScript.Shell")

  path="c:\python3\" 'path to folder
  IF NOT fso.FolderExists(path)  then
     TDOutput.Print "[info] Dossier '" & path & "' introuvable"
     path="c:\python34\"
  END IF
  IF NOT fso.FolderExists(path)  then
     TDOutput.Print "[info] Dossier '" & path & "' introuvable"
     path="c:\python35\"
  END IF
  IF NOT fso.FolderExists(path)  then
     TDOutput.Print "[info] Dossier '" & path & "' introuvable"
     path="c:\python36\"
  END IF
  If Not Debug Then
    Set Steps = CurrentRun.StepFactory.NewList("")
    For i =1 to Steps.count
        dim tf
        dim ts
        set tf=TDconnection.testFactory
        set ts=tf.item(currentTsTest.Field("TC_TEST_ID"))

        atch=TDHelper.DownloadAttachment("step" & i &".py",ts)
        If Err.Number <> 0 Then
           'stepi.py n'existe pas -> étape non automatisée
            Steps.Item(i).Field("ST_ACTUAL") = "N/A"
            Steps.Item(i).Status = "N/A"
            TDOutput.Print "[info] Etape " & i & " non automatisée..."
            Err.clear 'c'est bon on a traité l'erreur
        else

            result=XTools.run(path & "python",atch & " " & chainearguments  , -1)
            ' Step i
            TDOutput.Print "Résultat d'exécution:" & result
            if result = 0 then
               Steps.Item(i).Field("ST_ACTUAL") = "Passed"
               Steps.Item(i).Status = "Passed"
            else
               Steps.Item(i).Field("ST_ACTUAL") = "Failed"
               Steps.Item(i).Status = "Failed"
            end if
            IF result =-1 then
               Steps.Item(i).Field("ST_ACTUAL") = "Blocked"
               Steps.Item(i).Status = "Blocked"
               call Err.Raise(60001, "lanceur VBS","Environnement Python35 local introuvable")
               Exit For
            END IF
        END IF
    Next
    ' update steps
    Steps.Post
  End If
  ' handle run-time errors
  If Err.Number <> 0 Then
    TDOutput.Print "[Err!] Run-time error [" & Err.Number & "] : " & Err.Description
    ' update execution status in "Test" mode
    If Not Debug Then
      CurrentRun.Status = "Failed"
      CurrentTSTest.Status = "Failed"
    End If
  End If
End Sub

Function RemoveHTML( strText )
    Dim TAGLIST
    TAGLIST = ";!--;!DOCTYPE;A;ACRONYM;ADDRESS;APPLET;AREA;B;BASE;BASEFONT;" &_
              "BGSOUND;BIG;BLOCKQUOTE;BODY;BR;BUTTON;CAPTION;CENTER;CITE;CODE;" &_
              "COL;COLGROUP;COMMENT;DD;DEL;DFN;DIR;DIV;DL;DT;EM;EMBED;FIELDSET;" &_
              "FONT;FORM;FRAME;FRAMESET;HEAD;H1;H2;H3;H4;H5;H6;HR;HTML;I;IFRAME;IMG;" &_
              "INPUT;INS;ISINDEX;KBD;LABEL;LAYER;LAGEND;LI;LINK;LISTING;MAP;MARQUEE;" &_
              "MENU;META;NOBR;NOFRAMES;NOSCRIPT;OBJECT;OL;OPTION;P;PARAM;PLAINTEXT;" &_
              "PRE;Q;S;SAMP;SCRIPT;SELECT;SMALL;SPAN;STRIKE;STRONG;STYLE;SUB;SUP;" &_
              "TABLE;TBODY;TD;TEXTAREA;TFOOT;TH;THEAD;TITLE;TR;TT;U;UL;VAR;WBR;XMP;"

    Const BLOCKTAGLIST = ";APPLET;EMBED;FRAMESET;HEAD;NOFRAMES;NOSCRIPT;OBJECT;SCRIPT;STYLE;"

    Dim nPos1
    Dim nPos2
    Dim nPos3
    Dim strResult
    Dim strTagName
    Dim bRemove
    Dim bSearchForBlock

    nPos1 = InStr(strText, "<")
    Do While nPos1 > 0
        nPos2 = InStr(nPos1 + 1, strText, ">")
        If nPos2 > 0 Then
            strTagName = Mid(strText, nPos1 + 1, nPos2 - nPos1 - 1)
        strTagName = Replace(Replace(strTagName, vbCr, " "), vbLf, " ")

            nPos3 = InStr(strTagName, " ")
            If nPos3 > 0 Then
                strTagName = Left(strTagName, nPos3 - 1)
            End If

            If Left(strTagName, 1) = "/" Then
                strTagName = Mid(strTagName, 2)
                bSearchForBlock = False
            Else
                bSearchForBlock = True
            End If

            If InStr(1, TAGLIST, ";" & strTagName & ";", vbTextCompare) > 0 Then
                bRemove = True
                If bSearchForBlock Then
                    If InStr(1, BLOCKTAGLIST, ";" & strTagName & ";", vbTextCompare) > 0 Then
                        nPos2 = Len(strText)
                        nPos3 = InStr(nPos1 + 1, strText, "</" & strTagName, vbTextCompare)
                        If nPos3 > 0 Then
                            nPos3 = InStr(nPos3 + 1, strText, ">")
                        End If

                        If nPos3 > 0 Then
                            nPos2 = nPos3
                        End If
                    End If
                End If
            Else
                bRemove = False
            End If

            If bRemove Then
                strResult = strResult & Left(strText, nPos1 - 1)
                strText = Mid(strText, nPos2 + 1)
            Else
                strResult = strResult & Left(strText, nPos1)
                strText = Mid(strText, nPos1 + 1)
            End If
        Else
            strResult = strResult & strText
            strText = ""
        End If

        nPos1 = InStr(strText, "<")
    Loop
    strResult = strResult & strText

    RemoveHTML = strResult
End Function