You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cloudstack.apache.org by ts...@apache.org on 2012/07/30 12:07:19 UTC
[16/16] git commit: The NoseTestLoader to pick cloudStackTestCase as
tests
The NoseTestLoader to pick cloudStackTestCase as tests
Project: http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/commit/91b6e09e
Tree: http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/tree/91b6e09e
Diff: http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/diff/91b6e09e
Branch: refs/heads/master
Commit: 91b6e09e6d46edf9484423bb1e2b36a5ec8fa74f
Parents: 9443734
Author: Prasanna Santhanam <Pr...@citrix.com>
Authored: Sat Jul 7 17:59:39 2012 +0530
Committer: Prasanna Santhanam <ts...@apache.org>
Committed: Mon Jul 30 15:27:55 2012 +0530
----------------------------------------------------------------------
tools/marvin/marvin/NoseTestExecuteEngine.py | 98 ++++++++++++---------
1 files changed, 55 insertions(+), 43 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/91b6e09e/tools/marvin/marvin/NoseTestExecuteEngine.py
----------------------------------------------------------------------
diff --git a/tools/marvin/marvin/NoseTestExecuteEngine.py b/tools/marvin/marvin/NoseTestExecuteEngine.py
index ca1afb4..9d7944a 100644
--- a/tools/marvin/marvin/NoseTestExecuteEngine.py
+++ b/tools/marvin/marvin/NoseTestExecuteEngine.py
@@ -18,33 +18,49 @@
from functools import partial
import unittest
import nose
-import nose.config
import nose.core
import os
import sys
import logging
+import xmlrunner
from cloudstackTestCase import cloudstackTestCase
-from nose.suite import ContextSuite, ContextSuiteFactory
-
-class CloudStackTestSelector(nose.selector.Selector):
- """
- custom test selector for cloudstackTestCase
- """
-
- def wantClass(self, cls):
- if issubclass(cls, cloudstackTestCase):
- return nose.selector.Selector.wantClass(self, cls)
def testCaseLogger(message, logger=None):
if logger is not None:
logger.debug(message)
+
+class NoseCloudStackTestLoader(nose.loader.TestLoader):
+ """
+ Custom test loader for the cloudstackTestCase to be loaded into nose
+ """
+
+ def loadTestsFromTestCase(self, testCaseClass):
+ if issubclass(testCaseClass, cloudstackTestCase):
+ testCaseNames = self.getTestCaseNames(testCaseClass)
+ tests = []
+ for testCaseName in testCaseNames:
+ testCase = testCaseClass(testCaseName)
+ tests.append(testCase)
+ return self.suiteClass(tests)
+ else:
+ return super(NoseCloudStackTestLoader, self).loadTestsFromTestCase(testCaseClass)
+
+ def loadTestsFromName(self, name, module=None, discovered=False):
+ return nose.loader.TestLoader.loadTestsFromName(self, name, module=module, discovered=discovered)
+
+ def loadTestsFromNames(self, names, module=None):
+ return nose.loader.TestLoader.loadTestsFromNames(self, names, module=module)
+
class NoseTestExecuteEngine(object):
- def __init__(self, testclient=None, workingdir=None, clientLog=None, resultLog=None, format="text"):
+ """
+ Runs the CloudStack tests using nose as the execution engine
+ """
+
+ def __init__(self, testclient=None, workingdir=None, filename=None, clientLog=None, resultLog=None, format="text"):
self.testclient = testclient
self.logformat = logging.Formatter("%(asctime)s - %(levelname)s - %(name)s - %(message)s")
self.suite = []
- realPath = os.path.abspath(workingdir)
if clientLog is not None:
self.logfile = clientLog
@@ -61,42 +77,38 @@ class NoseTestExecuteEngine(object):
fp = open(resultLog, "w")
self.testResultLogFile = fp
else:
- self.testResultLogFile = sys.stdout
+ self.testResultLogFile = sys.stderr
- if workingdir is not None and os.path.exists(realPath + '/' + '__init__.py'):
- self.loader = nose.loader.TestLoader()
- [self.suite.append(test) for test in self.loader.discover(workingdir, "test*.py")]
+ if workingdir is not None:
+ self.loader = NoseCloudStackTestLoader()
+ self.suite = self.loader.loadTestsFromName(workingdir)
for test in self.suite:
- self.injectTestCase(test)
- print self.suite[0].countTestCases()
+ self.injectClients(test)
+ elif filename is not None:
+ self.loader = NoseCloudStackTestLoader()
+ self.suite = self.loader.loadTestsFromFile(filename)
+ for test in self.suite:
+ self.injectClients(test)
else:
- raise Exception("Single module test runs unsupported using Nose")
-
+ raise EnvironmentError("Need to give either a test directory or a test file")
+
if format == "text":
self.runner = nose.core.TextTestRunner(stream=self.testResultLogFile, descriptions=1, verbosity=2, config=None)
else:
- raise Exception("XML runner not supported under nose")
+ self.runner = xmlrunner.XMLTestRunner(output='xml-reports', verbose=True)
def runTests(self):
- #testProgram = nose.core.TestProgram(argv=["--process-timeout=3600"], testRunner = self.runner, testLoader = self.loader)
- testProgram = nose.core.TestProgram(argv=["--process-timeout=3600"], testRunner = self.runner, suite = self.suite)
- testProgram.runTests()
+ nose.core.TestProgram(argv=["--process-timeout=3600"], testRunner=self.runner, testLoader=self.loader)
+
+ def injectClients(self, test):
+ testcaselogger = logging.getLogger("testclient.testcase.%s"%test.__class__.__name__)
+ fh = logging.FileHandler(self.logfile)
+ fh.setFormatter(self.logformat)
+ testcaselogger.addHandler(fh)
+ testcaselogger.setLevel(logging.DEBUG)
- def injectTestCase(self, testSuites):
- for test in testSuites:
- if isinstance(test, unittest.BaseTestSuite):
- self.injectTestCase(test)
- else:
- #logger bears the name of the test class
- testcaselogger = logging.getLogger("testclient.testcase.%s"%test.__class__.__name__)
- fh = logging.FileHandler(self.logfile)
- fh.setFormatter(self.logformat)
- testcaselogger.addHandler(fh)
- testcaselogger.setLevel(logging.DEBUG)
-
- #inject testclient and logger into each unittest
- setattr(test, "testClient", self.testclient)
- setattr(test, "debug", partial(testCaseLogger, logger=testcaselogger))
- setattr(test.__class__, "clstestclient", self.testclient)
- if hasattr(test, "UserName"):
- self.testclient.createNewApiClient(test.UserName, test.DomainName, test.AcctType)
+ setattr(test, "testClient", self.testclient)
+ setattr(test, "debug", partial(testCaseLogger, logger=testcaselogger))
+ setattr(test.__class__, "clstestclient", self.testclient)
+ if hasattr(test, "UserName"):
+ self.testclient.createNewApiClient(test.UserName, test.DomainName, test.AcctType)