source: orange/Orange/testing/unit/tests/test_regression.py @ 11591:05936ca5105f

Revision 11591:05936ca5105f, 5.2 KB checked in by astaric, 11 months ago (diff)

Improved regression test.

RevLine 
[10180]1import sys
2import os.path
[10278]3try:
4    import unittest2 as unittest
5except:
6    import unittest
[10180]7import subprocess
8
[11591]9import Orange
[10580]10from Orange.utils import environ
[10655]11from Orange.testing import testing
[10180]12
13
14class TestRegression(unittest.TestCase):
15    PLATFORM = sys.platform
16    PYVERSION = sys.version[:3]
17    STATES = ["OK", "timedout", "changed", "random", "error", "crash"]
[11591]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)
[10180]25
26    def setUp(self):
[11591]27        sys.path.append(self.orange_dir)
28
29    def tearDown(self):
30        del sys.path[-1]
[10180]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        tmpdir = os.getcwd().replace("\\", "/")
41        os.chdir(indir)
42        p = subprocess.Popen([sys.executable,
43                              os.path.join(roottest, "xtest_one.py"),
44                              name, "1", outdir],
45                              stdout=subprocess.PIPE,
46                              stderr=subprocess.PIPE)
47
48        stdout, stderr = p.communicate()
49        rv = stdout.strip().lower()
[11591]50        if rv == 'error':
51            self.assertEqual(stderr.split('\n'), [])
52        elif rv == 'changed':
53            expected_results = self.get_expected_results(outdir, name)
54            actual_results = self.get_actual_results(outdir, name)
55            self.assertEqual(actual_results, expected_results)
56
57
[10180]58        self.assertEqual(rv, "ok", "Regression test %s: %s" % (rv, name) \
59                        if stderr == "" else \
60                        "Regression test %s: %s\n\n%s" % (rv, name, stderr))
61        os.chdir(tmpdir)
62
[11591]63    def get_expected_results(self, outputdir, name):
64        expected_results = "%s/%s.%s.%s.txt" % (outputdir, name, sys.platform, sys.version[:3])
65        if not os.path.exists(expected_results):
66            expected_results = "%s/%s.%s.txt" % (outputdir, name, sys.platform)
67            if not os.path.exists(expected_results):
68                expected_results = "%s/%s.txt" % (outputdir, name)
69
70        with open(expected_results, 'r') as results:
71            return results.read().split('\n')
72
73    def get_actual_results(self, outputdir, name):
74        for state in TestRegression.STATES:
75            actual_results = "%s/%s.%s.%s.%s.txt" % (
76                outputdir, name, TestRegression.PLATFORM,
77                TestRegression.PYVERSION, state)
78
79            if os.path.exists(actual_results):
80                with open(actual_results, 'r') as results:
81                    return results.read().split('\n')
82
83
[10180]84root = os.path.normpath(os.path.join(environ.install_dir, ".."))
85roottest = os.path.join(root, "Orange/testing/regression")
86
87dirs = [("tests", "Orange/testing/regression/tests"),
88        ("tests_20", "Orange/testing/regression/tests_20"),
89        ("tutorial", "docs/tutorial/rst/code"),
90        ("reference", "docs/reference/rst/code")]
91
92for dirname, indir in dirs:
93    indir = os.path.join(root, indir)
94    outdir = "%s/results_%s" % (roottest, dirname)
95
96    if not os.path.exists(outdir):
97        os.mkdir(outdir)
98
99    exclude = os.path.join(indir, "exclude-from-regression.txt")
100    dont_test = [x.strip() for x in file(exclude).readlines()] if \
101                                        os.path.exists(exclude) else []
102    test_set = []
103    names = sorted([name for name in os.listdir(indir) if \
104                    name[-3:] == ".py"and name not in dont_test])
105
106    for name in names:
107        if not os.path.exists(os.path.join(outdir, name + ".txt")):
108            # past result not available
109            test_set.append((name, "new"))
110        else:
111            # past result available
112            for state in TestRegression.STATES:
113                if os.path.exists("%s/%s.%s.%s.%s.txt" % \
114                               (outdir, name, TestRegression.PLATFORM, \
115                                TestRegression.PYVERSION, state)):
116                    test_set.append((name, state))
117                    # current result already on disk
118                    break
119            else:
120                if os.path.exists("%s/%s.%s.%s.random1.txt" % \
121                                  (outdir, name, TestRegression.PLATFORM, \
122                                   TestRegression.PYVERSION)):
123                    test_set.append((name, "random"))
124                else:
125                    test_set.append((name, "OK"))
126
127    for name, last_res in test_set:
128        newname, func = testing._expanded(TestRegression.test_regression_on,
129                                           "%s_%s" % (dirname, name[:-3]),
130                                           (roottest, indir, outdir, name))
131        setattr(TestRegression, newname, func)
132
[10306]133setattr(TestRegression, "test_regression_on", None)
134func = None
[10385]135
136if __name__ == "__main__":
[10580]137    unittest.main()
Note: See TracBrowser for help on using the repository browser.