source: orange/Orange/testing/unit/tests/test_regression.py @ 11715:7b4d1d2fdad1

Revision 11715:7b4d1d2fdad1, 5.3 KB checked in by Ales Erjavec <ales.erjavec@…>, 7 months ago (diff)

Added a check for the test script exit code.

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        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()
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        self.assertEqual(rv, "ok", "Regression test %s: %s" % (rv, name) \
58                        if stderr == "" else \
59                        "Regression test %s: %s\n\n%s" % (rv, name, stderr))
60
61        self.assertEqual(p.wait(), 0,
62                         "Test script exited with a non zero error code.")
63
64        os.chdir(tmpdir)
65
66    def get_expected_results(self, outputdir, name):
67        expected_results = "%s/%s.%s.%s.txt" % (outputdir, name, sys.platform, sys.version[:3])
68        if not os.path.exists(expected_results):
69            expected_results = "%s/%s.%s.txt" % (outputdir, name, sys.platform)
70            if not os.path.exists(expected_results):
71                expected_results = "%s/%s.txt" % (outputdir, name)
72
73        with open(expected_results, 'r') as results:
74            return results.read().split('\n')
75
76    def get_actual_results(self, outputdir, name):
77        for state in TestRegression.STATES:
78            actual_results = "%s/%s.%s.%s.%s.txt" % (
79                outputdir, name, TestRegression.PLATFORM,
80                TestRegression.PYVERSION, state)
81
82            if os.path.exists(actual_results):
83                with open(actual_results, 'r') as results:
84                    return results.read().split('\n')
85
86
87root = os.path.normpath(os.path.join(environ.install_dir, ".."))
88roottest = os.path.join(root, "Orange/testing/regression")
89
90dirs = [("tests", "Orange/testing/regression/tests"),
91        ("tests_20", "Orange/testing/regression/tests_20"),
92        ("tutorial", "docs/tutorial/rst/code"),
93        ("reference", "docs/reference/rst/code")]
94
95for dirname, indir in dirs:
96    indir = os.path.join(root, indir)
97    outdir = "%s/results_%s" % (roottest, dirname)
98
99    if not os.path.exists(outdir):
100        os.mkdir(outdir)
101
102    exclude = os.path.join(indir, "exclude-from-regression.txt")
103    dont_test = [x.strip() for x in file(exclude).readlines()] if \
104                                        os.path.exists(exclude) else []
105    test_set = []
106    names = sorted([name for name in os.listdir(indir) if \
107                    name[-3:] == ".py"and name not in dont_test])
108
109    for name in names:
110        if not os.path.exists(os.path.join(outdir, name + ".txt")):
111            # past result not available
112            test_set.append((name, "new"))
113        else:
114            # past result available
115            for state in TestRegression.STATES:
116                if os.path.exists("%s/%s.%s.%s.%s.txt" % \
117                               (outdir, name, TestRegression.PLATFORM, \
118                                TestRegression.PYVERSION, state)):
119                    test_set.append((name, state))
120                    # current result already on disk
121                    break
122            else:
123                if os.path.exists("%s/%s.%s.%s.random1.txt" % \
124                                  (outdir, name, TestRegression.PLATFORM, \
125                                   TestRegression.PYVERSION)):
126                    test_set.append((name, "random"))
127                else:
128                    test_set.append((name, "OK"))
129
130    for name, last_res in test_set:
131        newname, func = testing._expanded(TestRegression.test_regression_on,
132                                           "%s_%s" % (dirname, name[:-3]),
133                                           (roottest, indir, outdir, name))
134        setattr(TestRegression, newname, func)
135
136setattr(TestRegression, "test_regression_on", None)
137func = None
138
139if __name__ == "__main__":
140    unittest.main()
Note: See TracBrowser for help on using the repository browser.