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