source: orange/Orange/testing/unit/tests/test_regression.py @ 11844:11a3f0ea308e

Revision 11844:11a3f0ea308e, 5.6 KB checked in by Ales Erjavec <ales.erjavec@…>, 3 months ago (diff)

Add current working directory to PYTHONPATH before running regression scripts.

Line 
1import sys
2import os.path
3try:
4    import unittest2 as unittest
5except:
6    import unittest
7import subprocess
8
9import Orange
10from Orange.utils import environ
11from Orange.testing import testing
12
13
14class TestRegression(unittest.TestCase):
15    PLATFORM = sys.platform
16    PYVERSION = sys.version[:3]
17    STATES = ["OK", "timedout", "changed", "random", "error", "crash"]
18    maxDiff = None
19
20    def __init__(self, methodName='runTest'):
21        super(TestRegression, self).__init__(methodName)
22        self.orange_dir = os.path.dirname(Orange.__file__)
23        self.orange_dir = os.path.join(self.orange_dir, '..')
24        self.orange_dir = os.path.realpath(self.orange_dir)
25
26    def setUp(self):
27        sys.path.append(self.orange_dir)
28
29    def tearDown(self):
30        del sys.path[-1]
31
32    def test_regression_on(self, roottest, indir, outdir, name):
33        for state in TestRegression.STATES:
34            remname = "%s/%s.%s.%s.%s.txt" % \
35                                (outdir, name, TestRegression.PLATFORM, \
36                                 TestRegression.PYVERSION, state)
37            if os.path.exists(remname):
38                os.remove(remname)
39
40        # Add the current dir to PYTHONPATH because the cwd will
41        # be changed in subprocess call.
42        cwd = os.getcwd()
43        env = dict(os.environ)
44        pypath = env.get("PYTHONPATH", "")
45        if pypath:
46            pypath = os.path.pathsep.join([cwd, pypath])
47        else:
48            pypath = cwd
49        env["PYTHONPATH"] = pypath
50
51        p = subprocess.Popen([sys.executable,
52                              os.path.join(roottest, "xtest_one.py"),
53                              name, "1", outdir],
54                              stdout=subprocess.PIPE,
55                              stderr=subprocess.PIPE,
56                              env=env,
57                              cwd=indir)
58
59        stdout, stderr = p.communicate()
60        rv = stdout.strip().lower()
61        if rv == 'error':
62            self.assertEqual(stderr.split('\n'), [])
63        elif rv == 'changed':
64            expected_results = self.get_expected_results(outdir, name)
65            actual_results = self.get_actual_results(outdir, name)
66            self.assertEqual(actual_results, expected_results)
67
68        self.assertEqual(rv, "ok", "Regression test %s: %s" % (rv, name) \
69                        if stderr == "" else \
70                        "Regression test %s: %s\n\n%s" % (rv, name, stderr))
71
72        self.assertEqual(p.wait(), 0,
73                         "Test script exited with a non zero error code.")
74
75    def get_expected_results(self, outputdir, name):
76        expected_results = "%s/%s.%s.%s.txt" % (outputdir, name, sys.platform, sys.version[:3])
77        if not os.path.exists(expected_results):
78            expected_results = "%s/%s.%s.txt" % (outputdir, name, sys.platform)
79            if not os.path.exists(expected_results):
80                expected_results = "%s/%s.txt" % (outputdir, name)
81
82        with open(expected_results, 'r') as results:
83            return results.read().split('\n')
84
85    def get_actual_results(self, outputdir, name):
86        for state in TestRegression.STATES:
87            actual_results = "%s/%s.%s.%s.%s.txt" % (
88                outputdir, name, TestRegression.PLATFORM,
89                TestRegression.PYVERSION, state)
90
91            if os.path.exists(actual_results):
92                with open(actual_results, 'r') as results:
93                    return results.read().split('\n')
94
95
96root = os.path.normpath(os.path.join(environ.install_dir, ".."))
97roottest = os.path.join(root, "Orange/testing/regression")
98
99dirs = [("tests", "Orange/testing/regression/tests"),
100        ("tests_20", "Orange/testing/regression/tests_20"),
101        ("tutorial", "docs/tutorial/rst/code"),
102        ("reference", "docs/reference/rst/code")]
103
104for dirname, indir in dirs:
105    indir = os.path.join(root, indir)
106    outdir = "%s/results_%s" % (roottest, dirname)
107
108    if not os.path.exists(outdir):
109        os.mkdir(outdir)
110
111    exclude = os.path.join(indir, "exclude-from-regression.txt")
112    dont_test = [x.strip() for x in file(exclude).readlines()] if \
113                                        os.path.exists(exclude) else []
114    test_set = []
115    names = sorted([name for name in os.listdir(indir) if \
116                    name[-3:] == ".py"and name not in dont_test])
117
118    for name in names:
119        if not os.path.exists(os.path.join(outdir, name + ".txt")):
120            # past result not available
121            test_set.append((name, "new"))
122        else:
123            # past result available
124            for state in TestRegression.STATES:
125                if os.path.exists("%s/%s.%s.%s.%s.txt" % \
126                               (outdir, name, TestRegression.PLATFORM, \
127                                TestRegression.PYVERSION, state)):
128                    test_set.append((name, state))
129                    # current result already on disk
130                    break
131            else:
132                if os.path.exists("%s/%s.%s.%s.random1.txt" % \
133                                  (outdir, name, TestRegression.PLATFORM, \
134                                   TestRegression.PYVERSION)):
135                    test_set.append((name, "random"))
136                else:
137                    test_set.append((name, "OK"))
138
139    for name, last_res in test_set:
140        newname, func = testing._expanded(TestRegression.test_regression_on,
141                                           "%s_%s" % (dirname, name[:-3]),
142                                           (roottest, indir, outdir, name))
143        setattr(TestRegression, newname, func)
144
145setattr(TestRegression, "test_regression_on", None)
146func = None
147
148if __name__ == "__main__":
149    unittest.main()
Note: See TracBrowser for help on using the repository browser.