We’re an enterprise user of testproject.io and are very concerned with the recent developments and outages of this platform.
We like the service and chose it as the foundation of our automation testing endeavours. I’m sure we’d have no problem supporting it commercially, as we see real value here.
Testproject.io should come forward with some statement about what is going on and if there’s any future for this platform.
I understand companies go through difficulties but please take in consideration those relying on you and that can actually be a part of any solution going forward.
It’s the worst and I feel your pain. We are currently planning our move to a different tool. And one thing’s for sure, we will not be using Tricentis again after the way they’ve handled TP in the last couple months. I suppose we knew the risks using a free tool from a company that also offered paid tools that do the same thing, though a large reason why we took that risk is that Tricentis promised we had nothing to worry about.
Anyway, if you end up at the same difficult conclusion, some tips for minimizing the work of recreating all the work that went to trash on TP:
download the test document for all of your test. These can function as outlines for rewriting your tests with all the same supporting test methods, parameters, and elements used in them.
I was trying to figure out a way to harvest all of the element locators I’ve created in TP so I can easily copy/paste them over to another tool, and the best way I could come up with was:
– download all the files from git (set up a git integration if you don’t have one already)
– wrote a python script to recursively go through the whole repository, scanning every file for an ‘elements’ section (where it keeps all element data used within that test), and extract all the info to a csv (took about a day to make the script, I can share if anyone’s interested)
– use excel function to remove duplicates from the element list
– I ended up with a file of about 1000 unique elements used by my tests, which will save me SO much time rewriting my tests.
Caveat to all of this is if I still have my job after this, since I was the one responsible from implementing TestProject and put about 2 years worth of work into it. Seriously, f u tricentis.
Overview: by downloading your testproject git repo and running these scripts (of course modify them as necessary to work for you, hopefully should just be the path variable), they will recursively go through every subdirectory and look at every test file. Each test file has an “elements” section which holds the data of any element used by that test. It will do some regex magic to pull the data of all those elements and print them to a csv, leaving you a thorough list of all your elements and locators to copy/paste into the next tool you use.
So let’s do it.
Sync your TP project with git (if you haven’t done this, see TP’s own documentation to set this up). Sign in to your git account and download the whole repository. Extract the zip to whatever location you want.
Create 2 python scripts (location doesn’t matter): elementExtractorMain.py and getElementsFromFile.py
elementExtractor.py:
import sys
import os
import csv
def main():
# Process command-line arguments
if len(sys.argv) > 2: # Command-line arguments are kept in a list 'sys.argv'
print(__doc__)
sys.exit(1) # Return a non-zero value to indicate abnormal termination
elif len(sys.argv) == 2:
dir = sys.argv[1] # directory given in command-line argument
else:
dir = '.' # default current directory
# manually override dir for debug
dir = 'C:/main/directory/for/testproject-repo'
# Verify dir
if not os.path.isdir(dir):
print('error: {} does not exists'.format(dir))
sys.exit(1)
# create/open csv to write to
with open('elements.csv', 'w', encoding='utf8', newline='') as f:
fWriter = csv.writer(f)
header = ['Name','Element Type','Locator Type','Locator'] # create header row
fWriter.writerow(header)
# Recursively walk thru dir using os.walk()
for curr_dir, subdirs, files in os.walk(dir):
# os.walk() recursively walk thru the given "dir" and its sub-directories
for file in sorted(files): # print all files under "curr_dir"
fullPath = os.path.join(os.path.abspath(curr_dir), file) # full filename
print(fullPath) # mostly for debugging but also so you know it's doing its thing
os.system("python getElementsFromFile.py \"" + fullPath + "\"") # run other script with file path
if __name__ == '__main__':
main()
getElementsFromFile.py:
import os
import sys
import re
import csv
# parse args
path = sys.argv[1]
# for debugging - test data
#path = 'C:/path/to/individual-file/just-to-make-sure-it-works'
elementsText = ''
# open specified file
with open(path,'r') as f:
contents = f.read() # get file contents
indexStart = contents.find('elements') # determine if file has an elements section
if indexStart >= 0: # if it does...
indexEnd = contents.find('projectParameters') # get end index
elementsText += '\n' + contents[indexStart:indexEnd].replace('elements:\n','') # grab all the stuff in between
if elementsText != '':
elements = re.split('- id: |- &', elementsText) # break up entire element section into strings of actual elements
#print(elements) # for debugging
if elements and elements != ['\nelements: []\n']: #if there are actual elements in the elements section
if '\n' in elements:
elements.remove('\n') # sometimes the section begins with a newline which messes things up, take them out.
# open csv to write to
with open('elements.csv', 'a', encoding='utf8', newline='') as f:
fWriter = csv.writer(f)
# extract all elements from this file
for element in elements:
#print(element + '\n') # for debugging
text = element
# bunch of regex magic is about to happen... this is what worked for me to find the element attributes we're after...
nameObj = re.search(r'(?<=name: ).*?(?=\n.*description|\n.*type)',text) # get element name
name = nameObj.group()
text = text[nameObj.end():]
elementTypeObj = re.search(r'(?<=name: ).*?(?=\n.*source)',element) # get element type
elementType = elementTypeObj.group()
text = text[elementTypeObj.end():]
locatorTypeObj = re.search(r'(?<=name: ).*?(?=\n.*value)',element) # get locator type (xpath, css, etc)
locatorType = locatorTypeObj.group()
locatorObj = re.search(r'(?<=value: ).*?(?=\n.*priority)',element) # get actual locator for element
locator = locatorObj.group()
elementInfo = [name, elementType, locatorType, locator] # write all this to the csv
fWriter.writerow(elementInfo)
Run elementExtractorMain.py in vscode, powershell, or however you like to run python scripts (if you never have, google can get you set up pretty quickly).
Theoretically, if this worked, you should have a csv in the same location as your python scripts that contains every element used from all your tests. there will be a bunch of duplicates. Open excel or google sheets and you’ll be able to remove duplicates in the “name” column.
Thanks for sharing that script.
We’re definitely moving away from testproject.io and will actively avoid any Tricentis products in the future. I understand this is a free product but can’t tolerate doing business with a company so disrespectful of their users.
We’re going to evaluate what other options we have but my gut feeling is to avoid all these nice UI frontends and just go straight to Selenium. That will mean maintaining our own infrastructure, test-agents, code, etc, which I’d rather not have to worry about tbh.
I’ll look internally if we can write a migration tool that will pick the github export from TP and convert it into runnable code. We’re only 4 months into TP but I’d bet it’s quicker to invest in a migration tool than having to redo it from scratch.
If we end up developing this (or even starting!) I’ll make sure to open source it and share it on github.