TestCenter Reference
Config.py
Go to the documentation of this file.
2# Copyright 2007, MeVis Medical Solutions AG
3#
4# The user may use this file in accordance with the license agreement provided with
5# the Software or, alternatively, in accordance with the terms contained in a
6# written agreement between the user and MeVis Medical Solutions AG.
7#
8# For further information use the contact form at https://www.mevislab.de/contact
9#
10
13
14
15# -- local imports
16try:
17 import mevis
18
19 mevisAvailable = hasattr(mevis, "MLAB") and hasattr(mevis.MLAB, "isDebug") and mevis.MLAB.isDebug() is not None
20except ImportError:
21 mevisAvailable = False
22
23from . import Utils
24
25import os
26import sys
27import tempfile
28
29import xml.etree.cElementTree as etree
30
31
32def getConfigFilePath(isTestCaseManager=False):
33 if Utils.isWindows:
34 path = os.path.join(os.environ["LOCALAPPDATA"], "MeVis", "MeVisLab")
35
36 elif Utils.isLinux:
37 if mevisAvailable:
38 path = mevis.MLABFileManager.getUserApplicationSupportDirectory()
39
40 else:
41 path = os.path.join(os.environ["HOME"], ".local", "share", "MeVis", "MeVisLab")
42
43 else:
44 path = os.getcwd()
45
46 if not os.path.isdir(path):
47 os.makedirs(path)
48
49 filePattern = "test_case_manager_cfg_{}.xml" if isTestCaseManager else "tc_cfg_{}.xml"
50 return os.path.join(path, filePattern.format(sys.platform))
51
52
54 if not os.path.isfile(cfgFile):
55 Configuration(cfgFile)
56 return False
57 return True
58
59
61 pass
62
63
64class ReportConfig:
65 @staticmethod
67 if Utils.isWindows:
68 return os.path.join(os.getenv("USERPROFILE"), "TestCenterReports")
69 return os.path.join(os.getenv("HOME"), "TestCenterReports")
70
72 self,
73 directory=getReportDir(),
74 name="Report",
75 timestampTemplate="_%y_%m_%d__%H_%M",
76 appendTestCaseName=False,
77 appendTimestamp=False,
78 collapseFunctions=False,
79 showFailedFuctionsOnly=False,
80 hideInfoMessages=False,
81 hideSystemMessages=False,
82 ):
83 self.directory = directory
84 self.name = name
85 self.timestampTemplate = timestampTemplate
86 self.appendTestCaseName = appendTestCaseName
87 self.appendTimestamp = appendTimestamp
88 self.collapseFunctions = collapseFunctions
89 self.showFailedFunctionsOnly = showFailedFuctionsOnly
90 self.hideInfoMessages = hideInfoMessages
91 self.hideSystemMessages = hideSystemMessages
94
95
97 def __init__(self, filePath=None, autoSave=True, isTestCaseManager=False):
98 """Loads configuration from given file or creates configuration with default values.
99 If a configuration is created and @a autoSave is True then the configuration is
100 automatically saved. Otherwise, you have to save is explicitly.
101 """
102 def getArguments():
103 return ["-nosplash", "-noide", "-quick"]
104
106 executablePath = ""
107 if mevisAvailable:
108 if Utils.isWindows:
109 executablePath = os.path.dirname(mevis.MLABFileManager.getExecutable("MeVisLab"))
110 elif Utils.isLinux:
111 executablePath = os.path.dirname(mevis.MLABFileManager.getExecutable("MeVisLab"))
112 elif "MLAB_BUILD" in os.environ:
113 # developer environment, use that, no questions asked
114 executablePath = os.path.abspath(os.path.join(os.environ.get("MLAB_BUILD"), "MeVisLab", "IDE", "bin"))
115 else:
116 # check public sdk location relative to this file
117 thisDir = os.path.dirname(os.path.abspath(__file__))
118 thisMLABRoot = os.path.normpath(os.path.join(thisDir, "..", "..", "..", "..", "..", ".."))
119 if Utils.isWindows:
120 path = os.path.abspath(os.path.join(thisMLABRoot, "MeVisLab", "IDE", "bin"))
121 if os.path.isfile(os.path.join(path, "MeVisLab.exe")):
122 executablePath = path
123 elif Utils.isLinux:
124 path = os.path.abspath(os.path.join(thisMLABRoot, "..", "bin"))
125 if os.path.isfile(os.path.join(path, "MeVisLab")):
126 executablePath = path
127
128 return executablePath
129
130 if Utils.isUnsupportedPlatform:
131 raise Exception("Unsupported platform (%s)" % sys.platform)
132
133
138 self.__MLABUseCurrent = True
139 self.__MLABArguments = getArguments()
140 self.__MLABCompileMode = "Automatic"
141 self.__resultOutputDirectory = os.path.join(tempfile.gettempdir(), "TestCenter")
142 self.__xmlResultFileName = "tc_result.xml"
143 self.__MLABSlaveLogFileName = "mevislab_slave.log"
145 # Number of TestCases after which MLAB is restarted during the execution of multiple
146 # tests. If this is set to zero, MLAB is not restarted at all.
148 # If a test is configured with a timeout above this value, do not execute it and let it fail.
150
152
153 self.__usePythonCoverage = False
154 # Controls if the python coverage measured during the execution of tests is accumulated
155 # into one report (True) or if for every test a separate report is generated (False).
156 self.__useGlobalPythonCoverage = False
157 # All files matching one of these expressions
158 # are excluded from the coverage for that test run.
159 exclusionExpressions = [
160 "*/TestSupport/*",
161 "*/TestCenterAdvanced/*",
162 "*/MLABPythonTools/*",
163 "*/*.script*",
164 "*/*.def*",
165 "*/IDE/mevislabInternal.py",
166 "*/__mevislab_bootstrap_importlib.py",
167 "*/Standard/Modules/Scripts/python/PackageSorter.py",
168 "*/BuildTools/Scripts/MeVisPython.py",
169 "*/@@scriptconsole*",
170 "*/site-packages/*",
171 "*$*",
172 ]
173
174 # convert to native path format
176 os.path.normpath(expression) for expression in exclusionExpressions
177 ]
178
180
181 # C++ coverage tool
182 self.__useBullseyeCoverage = False
184 self.__report = ReportConfig()
185
186 # The default config file name is tc_cfg_<platform>.xml which can be
187 # overwritten by explicitly specifying a filePath.
188 if not filePath:
189 filePath = getConfigFilePath(isTestCaseManager=isTestCaseManager)
190
191 cfgFileToLoad = filePath
192 if not os.path.isfile(cfgFileToLoad):
193 # for backward compatibility: read settings from config file of automated test center
194 cfgFileToLoad = getConfigFilePath(isTestCaseManager=False)
195
196 if os.path.isfile(cfgFileToLoad):
197 self.__load(cfgFileToLoad)
198
199 if autoSave and not os.path.isfile(filePath):
200 if mevisAvailable:
201 warningTemplate = (
202 "Config file <a href='mlab-open:{filePath}'>{fileName}</a> does not exist: creating it."
203 )
204 mevis.MLAB.logHTML(warningTemplate.format(filePath=filePath, fileName=os.path.basename(filePath)))
205 else:
206 print("Config file %s does not exist: creating it." % filePath)
207 self.save(filePath)
208
209 self.__configFilePath = os.path.abspath(filePath)
210
211 def __load(self, filename):
212 """Load the configuration values from the given file.
213 The method raises an exception if the given file does not exist. The method is private as it is
214 called by the classes' __init__ method.
215 """
216 if not os.path.isfile(filename):
217 raise Exception("Given file does not exist: %s" % filename)
218
219 xmlTree = etree.parse(filename)
220 xmlRoot = xmlTree.getroot()
221
222 self.fetchMLABSettings(xmlRoot)
223 self.fetchReportSettings(xmlRoot)
224 self.fetchCoverageSettings(xmlRoot)
225 self.fetchTestCaseManagerSettings(xmlRoot)
226 self.fetchIPCSettings(xmlRoot)
227
228 @staticmethod
230 return node is not None and node.text is not None
231
232 def fetchMLABSettings(self, xmlRoot):
233 node = xmlRoot.find("mlab/usecurrent")
234 if self.nodeHasValidText(node):
235 self.__MLABUseCurrent = node.text.lower() in ["true", "1", "yes", "on"]
236 else:
237 self.__MLABUseCurrent = True
238
239 node = xmlRoot.find("mlab/executable")
240 if self.nodeHasValidText(node):
241 self.__MLABExecutablePath = node.text
242
243 if node is not None:
244 mode = node.get("compilemode")
245 if mode:
246 self.__MLABCompileMode = mode
247 elif node.get("usedebug") == "True":
248 self.__MLABCompileMode = "Debug"
249 else:
250 self.__MLABCompileMode = "Automatic"
251
252 node = xmlRoot.find("mlab/arguments")
253 if self.nodeHasValidText(node):
254 self.__MLABArguments = node.text.split(",")
255
256 node = xmlRoot.find("mlab/resultdir")
257 if self.nodeHasValidText(node):
258 self.__resultOutputDirectory = node.text
259
260 node = xmlRoot.find("mlab/resultfile")
261 if self.nodeHasValidText(node):
262 self.__xmlResultFileName = node.text
263
264 node = xmlRoot.find("mlab/slavelogfile")
265 if self.nodeHasValidText(node):
266 self.__MLABSlaveLogFileName = node.text
267
268 node = xmlRoot.find("mlab/timeout")
269 if self.nodeHasValidText(node):
270 self.__defaultTestTimeoutSeconds = int(node.text)
271
272 node = xmlRoot.find("mlab/restartinterval")
273 if self.nodeHasValidText(node):
274 self.__mMLABRestartInterval = int(node.text)
275
276 node = xmlRoot.find("mlab/MaximumTestTimeout")
277 if self.nodeHasValidText(node):
278 self.__maxTestTimeoutSeconds = int(node.text)
279
280 def fetchReportSettings(self, xmlRoot):
281 self.fetchReportNodeSettings(xmlRoot)
282
283 node = xmlRoot.find("report/directory")
284 if self.nodeHasValidText(node):
285 self.__report.directory = node.text
286
287 node = xmlRoot.find("report/name")
288 if self.nodeHasValidText(node):
289 self.__report.name = node.text
290
291 node = xmlRoot.find("report/timestamp")
292 if self.nodeHasValidText(node):
293 self.__report.timestampTemplate = node.text
294
295 def fetchReportNodeSettings(self, xmlRoot):
296 reportNode = xmlRoot.find("report")
297 if not reportNode is None:
298 self.__report.appendTestCaseName = self.getBoolean(
299 reportNode, self.__report.appendTestCaseName, "appendTestCaseName"
300 )
301 self.__report.appendTimestamp = self.getBoolean(
302 reportNode, self.__report.appendTimestamp, "appendTimestamp"
303 )
304 self.__report.collapseFunctions = self.getBoolean(
305 reportNode, self.__report.collapseFunctions, "collapseFunctions"
306 )
307 self.__report.showFailedFunctionsOnly = self.getBoolean(
308 reportNode, self.__report.showFailedFunctionsOnly, "showFailedOnly"
309 )
310 self.__report.hideInfoMessages = self.getBoolean(reportNode, self.__report.hideInfoMessages, "hideInfos")
311 self.__report.hideSystemMessages = self.getBoolean(
312 reportNode, self.__report.hideSystemMessages, "hideSystemMessages"
313 )
314 self.__report.maxInfoMessagesPerTestFunction = self.getInteger(
315 reportNode, self.__report.maxInfoMessagesPerTestFunction, "maxInfoMessagesPerTestFunction"
316 )
317 self.__report.maxErrorMessagesPerTestFunction = self.getInteger(
318 reportNode, self.__report.maxErrorMessagesPerTestFunction, "maxErrorMessagesPerTestFunction"
319 )
320
321 @staticmethod
322 def getBoolean(node, default, attributeName):
323 boolean = default
324
325 attributeValue = node.get(attributeName)
326 if attributeValue is not None:
327 boolean = attributeValue == "True"
328
329 return boolean
330
331 @staticmethod
332 def getInteger(node, default, attributeName):
333 result = default
334
335 attributeValue = node.get(attributeName)
336 if attributeValue is not None:
337 try:
338 result = int(attributeValue)
339 except ValueError:
340 print("Error: Can't parse %s with value %s as int." % (attributeName, attributeValue))
341 return result
342
344 node = xmlRoot.find("TestCaseManager")
345 if not node is None:
346 b = self.getBoolean(node, True, "reloadPythonModulesBeforeTestExecution")
348
350 node = etree.SubElement(xmlRoot, "TestCaseManager")
351 node.set("reloadPythonModulesBeforeTestExecution", str(self.__shouldReloadPythonModulesWhenReloadingTestCases))
352
353 def fetchCoverageSettings(self, xmlRoot):
354 coverageNode = xmlRoot.find("Coverage")
355 if not coverageNode is None:
356 self.fetchBullseyeCoverageSettings(coverageNode)
357 self.fetchPythonCoverageSettings(coverageNode)
358
359 def fetchBullseyeCoverageSettings(self, coverageNode):
360 bullseyeNode = coverageNode.find("Bullseye")
361 if bullseyeNode is not None:
362 self.fetchUseBullseyeCoverage(bullseyeNode)
363
364 def fetchUseBullseyeCoverage(self, bullseyeNode):
365 self.__useBullseyeCoverage = self.getBoolean(bullseyeNode, self.__useBullseyeCoverage, "enabled")
366
367 def fetchPythonCoverageSettings(self, coverageNode):
368 pythonCoverageNode = coverageNode.find("Python")
369 if pythonCoverageNode is not None:
370 self.fetchUsePythonCoverage(pythonCoverageNode)
371 self.fetchUseGlobalPythonCoverage(pythonCoverageNode)
372 self.fetchPythonCoverageExclusionExpressions(pythonCoverageNode)
373 self.fetchPythonCoverageInclusionExpressions(pythonCoverageNode)
374
375 def fetchUsePythonCoverage(self, pythonCoverageNode):
376 self.__usePythonCoverage = self.getBoolean(pythonCoverageNode, self.__usePythonCoverage, "enabled")
377
378 def fetchUseGlobalPythonCoverage(self, pythonCoverageNode):
379 self.__useGlobalPythonCoverage = self.getBoolean(pythonCoverageNode, self.__useGlobalPythonCoverage, "global")
380
382 default = set(self.__pythonCoverageExclusionExpressions)
383 loaded = set([expression.text for expression in coverageNode.findall("ExclusionExpression")])
384 # build union of default and loaded expressions using set type
385 self.__pythonCoverageExclusionExpressions = list(default | loaded)
386 # replace forward slashes with system default
388 os.path.normpath(expression) for expression in self.__pythonCoverageExclusionExpressions
389 ]
390
392 default = set(self.__pythonCoverageInclusionExpressions)
393 loaded = set([expression.text for expression in coverageNode.findall("InclusionExpression")])
394 # build union of default and loaded expressions using set type
395 self.__pythonCoverageInclusionExpressions = list(default | loaded)
396 # replace forward slashes with system default
398 os.path.normpath(expression) for expression in self.__pythonCoverageInclusionExpressions
399 ]
400
401 def fetchIPCSettings(self, xmlRoot):
402 node = xmlRoot.find("IPCConnectionTimeout")
403 if self.nodeHasValidText(node):
404 self.__ipcConnectionTimeout = int(node.text)
405
406
409 def save(self, filename=None):
410 xmlRoot = etree.Element("Configuration")
411 xmlTree = etree.ElementTree(xmlRoot)
412
413 mlabNode = etree.SubElement(xmlRoot, "mlab")
414
415 etree.SubElement(mlabNode, "slavelogfile").text = self.__MLABSlaveLogFileName
416 etree.SubElement(mlabNode, "usecurrent").text = "True" if self.__MLABUseCurrent else "False"
417 node = etree.SubElement(mlabNode, "executable")
418 node.set("compilemode", self.__MLABCompileMode)
419 node.text = self.__MLABExecutablePath
420 etree.SubElement(mlabNode, "arguments").text = ",".join(self.__MLABArguments)
421 etree.SubElement(mlabNode, "resultdir").text = self.__resultOutputDirectory
422 etree.SubElement(mlabNode, "resultfile").text = self.__xmlResultFileName
423 etree.SubElement(mlabNode, "timeout").text = str(self.__defaultTestTimeoutSeconds)
424 etree.SubElement(mlabNode, "MaximumTestTimeout").text = str(self.__maxTestTimeoutSeconds)
425 etree.SubElement(mlabNode, "restartinterval").text = str(self.__mMLABRestartInterval)
426
427 reportNode = etree.SubElement(xmlRoot, "report")
428
429 etree.SubElement(reportNode, "directory").text = self.__report.directory
430 etree.SubElement(reportNode, "name").text = self.__report.name
431 etree.SubElement(reportNode, "timestamp").text = self.__report.timestampTemplate
432
433 reportNode.set("appendTestCaseName", str(self.__report.appendTestCaseName))
434 reportNode.set("appendTimestamp", str(self.__report.appendTimestamp))
435 reportNode.set("collapseFunctions", str(self.__report.collapseFunctions))
436 reportNode.set("showFailedOnly", str(self.__report.showFailedFunctionsOnly))
437 reportNode.set("hideInfos", str(self.__report.hideInfoMessages))
438 reportNode.set("hideSystemMessages", str(self.__report.hideSystemMessages))
439 reportNode.set("maxErrorMessagesPerTestFunction", str(self.__report.maxErrorMessagesPerTestFunction))
440 reportNode.set("maxInfoMessagesPerTestFunction", str(self.__report.maxInfoMessagesPerTestFunction))
441
442 coverageNode = etree.SubElement(xmlRoot, "Coverage")
443
444 pythonCoverageNode = etree.SubElement(coverageNode, "Python")
445 pythonCoverageNode.set("enabled", str(self.__usePythonCoverage))
446 pythonCoverageNode.set("global", str(self.__useGlobalPythonCoverage))
447
448 for expression in self.__pythonCoverageExclusionExpressions:
449 etree.SubElement(pythonCoverageNode, "ExclusionExpression").text = expression
450
451 for expression in self.__pythonCoverageInclusionExpressions:
452 etree.SubElement(pythonCoverageNode, "InclusionExpression").text = expression
453
454 bullseNode = etree.SubElement(coverageNode, "Bullseye")
455 bullseNode.set("enabled", str(self.__useBullseyeCoverage))
456
457 ipcConnectionTimeoutNode = etree.SubElement(xmlRoot, "IPCConnectionTimeout")
458 ipcConnectionTimeoutNode.text = str(self.__ipcConnectionTimeout)
459
460 self.storeTestCaseManagerSettings(xmlRoot)
461
462 Utils.indentXML(xmlRoot)
463
464 if filename is None:
465 filename = self.__configFilePath
466
467 try:
468 xmlTree.write(filename)
469 except Exception as e:
470 mevis.MLAB.logWarningHTML("Unable to write config file: %s.\n%s" % (filename, e))
471
473 return os.path.join(self.__resultOutputDirectory, self.__MLABSlaveLogFileName)
474
475 def setResultDir(self, directory):
476 self.__resultOutputDirectory = directory
477
478 def getResultDir(self):
479 return self.__resultOutputDirectory
480
481 def getResultFile(self):
482 return os.path.join(self.__resultOutputDirectory, self.__xmlResultFileName)
483
488 return os.path.expandvars(self.__MLABExecutablePath)
489
491 return self.__MLABUseCurrent
492
496 @staticmethod
497 def findMLABExecutable(basePath, executableName, subPath):
498 """
499 Searches for the executable in the basePath and all levels of the provided
500 subPath in a 'deepest first' manner
501 """
502 path = os.path.normpath(subPath)
503 pathComponents = path.split(os.sep)
504 pathComponents.append(executableName)
505
506 executablePath = None
507 while pathComponents:
508 candidate = os.path.join(basePath, *pathComponents)
509 if os.path.isfile(candidate):
510 executablePath = candidate
511 break
512
513 pathComponents.pop(0)
514
515 if executablePath is None:
517
518 return os.path.normpath(candidate)
519
521 expandedMLABPath = self.getMLABEffectiveBinariesPath()
522 mlabExecutableName = "MeVisLab_d" if self.useMLABDebugVersion() else "MeVisLab"
523 if Utils.isWindows:
524 mlabExecutableName += ".exe"
525
526 command = [
528 expandedMLABPath, mlabExecutableName, "Packages/MeVisLab/IDE/bin" if Utils.isWindows else "bin"
529 )
530 ]
531
532 return command
533
535 return self.__MLABArguments
536
538 return self.__MLABCompileMode
539
541 if self.__MLABCompileMode == "Debug":
542 return True
543 elif self.__MLABCompileMode == "Release":
544 return False
545 else:
546 return mevisAvailable and mevis.MLAB.isDebug()
547
548 def setMLABUseDebug(self, useDebug):
549 if useDebug:
550 self.__MLABCompileMode = "Debug"
551 else:
552 self.__MLABCompileMode = "Release"
553
557 def setTestCaseManagerOptions(self, shouldReloadPythonModulesWhenReloadingTestCases):
558 self.__shouldReloadPythonModulesWhenReloadingTestCases = shouldReloadPythonModulesWhenReloadingTestCases
559
560 def getMLABTestCenterCommand(self, macroName):
561 return (
563 + self.getMLABArguments()
564 + ["-nomateconnection", "-runmacro", macroName, "-c", self.__configFilePath]
565 )
566
567 def setMLABExecutablePath(self, executablePath):
568 if executablePath:
569 self.__MLABExecutablePath = executablePath
570
571 def setMLABUseCurrent(self, usecurrent):
572 self.__MLABUseCurrent = usecurrent
573
574 def setMLABArguments(self, arguments):
575 self.__MLABArguments = arguments
576
577 def setMLABCompileMode(self, value):
578 self.__MLABCompileMode = value
579
584 return self.__configFilePath
585
587 return self.__report
588
590 self,
591 directory,
592 name,
593 timestampTemplate,
594 appendTestCaseName,
595 appendTimestamp,
596 collapseFunctions,
597 showFailedFunctionsOnly,
598 hideInfoMessages,
599 hideSystemMessages,
600 ):
601 self.__report = ReportConfig(
602 directory,
603 name,
604 timestampTemplate,
605 appendTestCaseName,
606 appendTimestamp,
607 collapseFunctions,
608 showFailedFunctionsOnly,
609 hideInfoMessages,
610 hideSystemMessages,
611 )
612
614 return self.__report.directory
615
616 def getReportName(self):
617 return self.__report.name
618
620 return self.__report.timestampTemplate
621
623 return self.__report.appendTestCaseName
624
626 return self.__report.appendTimestamp
627
629 return self.__report.collapseFunctions
630
632 return self.__report.showFailedFunctionsOnly
633
635 return self.__report.hideInfoMessages
636
638 return self.__report.hideSystemMessages
639
647 return self.__usePythonCoverage
648
652 def setPythonCoverageEnabled(self, value):
653 self.__usePythonCoverage = True if value else False
654
656 self.__useGlobalPythonCoverage = True if value else False
657
659 return self.__useBullseyeCoverage
660
662 self.__useBullseyeCoverage = True if value else False
663
665 return self.__mMLABRestartInterval
666
668 return self.__maxTestTimeoutSeconds
669
getBoolean(node, default, attributeName)
Definition Config.py:322
save(self, filename=None)
Save the configuration variables set to the file with the given name.
Definition Config.py:409
setTestCaseManagerOptions(self, shouldReloadPythonModulesWhenReloadingTestCases)
Definition Config.py:557
__init__(self, filePath=None, autoSave=True, isTestCaseManager=False)
Loads configuration from given file or creates configuration with default values.
Definition Config.py:97
fetchBullseyeCoverageSettings(self, coverageNode)
Definition Config.py:359
setMLABExecutablePath(self, executablePath)
Definition Config.py:567
fetchUsePythonCoverage(self, pythonCoverageNode)
Definition Config.py:375
findMLABExecutable(basePath, executableName, subPath)
Searches for the executable in the basePath and all levels of the provided subPath in a 'deepest firs...
Definition Config.py:497
storeTestCaseManagerSettings(self, xmlRoot)
Definition Config.py:349
getMLABTestCenterCommand(self, macroName)
Definition Config.py:560
fetchPythonCoverageExclusionExpressions(self, coverageNode)
Definition Config.py:381
fetchUseGlobalPythonCoverage(self, pythonCoverageNode)
Definition Config.py:378
fetchTestCaseManagerSettings(self, xmlRoot)
Definition Config.py:343
fetchUseBullseyeCoverage(self, bullseyeNode)
Definition Config.py:364
setReportOptions(self, directory, name, timestampTemplate, appendTestCaseName, appendTimestamp, collapseFunctions, showFailedFunctionsOnly, hideInfoMessages, hideSystemMessages)
Definition Config.py:600
getInteger(node, default, attributeName)
Definition Config.py:332
fetchPythonCoverageInclusionExpressions(self, coverageNode)
Definition Config.py:391
fetchPythonCoverageSettings(self, coverageNode)
Definition Config.py:367
__init__(self, directory=getReportDir(), name="Report", timestampTemplate="_%y_%m_%d__%H_%M", appendTestCaseName=False, appendTimestamp=False, collapseFunctions=False, showFailedFuctionsOnly=False, hideInfoMessages=False, hideSystemMessages=False)
Definition Config.py:82
getConfigFilePath(isTestCaseManager=False)
Definition Config.py:32
verifyConfiguration(cfgFile)
Definition Config.py:53