source: orange/testing/regressionTests/xtest.py @ 9285:f9fd8a7be342

Revision 9285:f9fd8a7be342, 8.5 KB checked in by ales_erjavec <ales.erjavec@…>, 2 years ago (diff)

Changed report-html, now reports the changed output, original output and test script.

Line 
1#! usr/bin/env python
2
3import os, re, sys, time, subprocess
4import getopt
5import orngEnviron
6
7regtestdir = os.getcwd().replace("\\", "/")
8re_israndom = re.compile(r"#\s*xtest\s*:\s*RANDOM")
9
10date = "%2.2i-%2.2i-%2.2i" % time.localtime()[:3]
11
12platform = sys.platform
13pyversion = sys.version[:3]
14states = ["OK", "changed", "random", "error", "crash"]
15
16def file_name_match(name, patterns):
17    """Is any of the string in patterns a substring of name?"""
18    for p in patterns:
19        if p in name:
20            return True
21    return False
22
23def test_scripts(complete, just_print, module="orange", root_directory=".", 
24                test_files=None, directories=None):
25    """Test the scripts in the given directory."""
26    global error_status
27    if sys.platform == "win32" and sys.executable[-6:].upper() != "_D.EXE":
28        import win32process, win32api
29        win32process.SetPriorityClass(win32api.GetCurrentProcess(), 64)
30
31    caller_directory = os.getcwd()
32    os.chdir(root_directory) # directory to start the testing in
33    for dirname, dir in directories:
34        os.chdir(dir)
35        if module <> dirname:
36            outputsdir = "%s/results/%s/%s" % (regtestdir, module, dirname)
37        else:
38            outputsdir = "%s/results/%s" % (regtestdir, module)
39           
40        print "DIR %s (%s)" % (dirname, dir)
41        if not os.path.exists(outputsdir):
42            os.mkdir(outputsdir)
43
44        if os.path.exists("exclude-from-regression.txt"):
45            dont_test = [x.strip() for x in file("exclude-from-regression.txt").readlines()]
46        else:
47            dont_test = []
48        test_set = []
49
50        # file name filtering
51        names = [name for name in os.listdir('.') if name[-3:]==".py"]
52        if test_files:
53            names = [name for name in names if file_name_match(name, test_files)]
54        names = [name for name in names if name not in dont_test]
55        names.sort()
56
57        if names or True:
58            if just_print == "report-html":
59                print "<h2>Directory '%s'</h2>" % dir
60                print '<table class="xtest_report">'
61            elif just_print:
62                print "-" * 79
63                print "Directory '%s'" % dir
64                print
65
66        # test_set includes all the scripts (file, status) to be tested
67        for name in names:
68            if not os.path.exists("%s/%s.txt" % (outputsdir, name)):
69                # past result not available
70                test_set.append((name, "new"))
71            else:
72                # past result available
73                for state in states:
74                    if os.path.exists("%s/%s.%s.%s.%s.txt" % \
75                                      (outputsdir, name, platform, pyversion, state)):
76                        test_set.append((name, state))
77                        # current result already on disk
78                        break
79                else:
80                    if os.path.exists("%s/%s.%s.%s.random1.txt" % \
81                                      (outputsdir, name, platform, pyversion)):
82                        test_set.append((name, "random"))
83                    elif complete or just_print:
84                        test_set.append((name, "OK"))
85                    else:
86                        dont_test.append(name)
87
88        if just_print == "report-html":
89            for name, lastResult in test_set:
90                if lastResult =="OK":
91                    result = "results/%s/%s/%s.txt" % (module, dirname, name)
92                    print '''  <tr><td><a href="http://orange.biolab.si/trac/browser/trunk/orange/doc/%(dir)s/%(name)s">%(name)s</a></td>
93    <td><a href="%(result)s">%(lastResult)s</a></td>
94  </tr>''' % {"dir":dir, "name":name, "lastResult":lastResult, "result":result}
95   
96#                    print '  <tr><td><a href="results/%s/%s/%s.txt">%s</a></td><td>%s</td></tr>' % (module, dirname, name, name, lastResult)
97                elif lastResult in ["changed", "crash", "random"]:
98#                else:
99                    if lastResult == "random":
100                        result = "results/%s/%s/%s.%s.%s.%s.txt" % (module, dirname, name, platform, pyversion, lastResult+"1")
101                    else:
102                        result = "results/%s/%s/%s.%s.%s.%s.txt" % (module, dirname, name, platform, pyversion, lastResult)
103                    original = "results/%s/%s/%s.txt" % (module, dirname, name)
104                    print '''  <tr><td><a href="http://orange.biolab.si/trac/browser/trunk/orange/doc/%(dir)s/%(name)s">%(name)s</a>
105    </td><td><a href="%(result)s">%(lastResult)s</a></td>
106    <td><a href="%(original)s">original</a></td>
107  </tr>''' %  {"dir":dir, "name":name, "lastResult":lastResult, "result":result, "original":original}
108 
109            print "</table>"
110        elif just_print:
111            for name, lastResult in test_set:
112                print "%-30s %s" % (name, lastResult)
113               
114        else:
115            if dont_test:
116                print "Skipped: %s\n" % ", ".join(dont_test)
117
118            for name, lastResult in test_set:
119                print "%s (%s): " % (name, lastResult == "new" and lastResult or ("last: %s" % lastResult)),
120                sys.stdout.flush()
121
122                for state in ["crash", "error", "new", "changed", "random1", "random2"]:
123                    remname = "%s/%s.%s.%s.%s.txt" % \
124                              (outputsdir, name, platform, pyversion, state)
125                    if os.path.exists(remname):
126                        os.remove(remname)
127                   
128                titerations = re_israndom.search(open(name, "rt").read()) and 1 or iterations
129                os.spawnl(os.P_WAIT, sys.executable, "-c", regtestdir+"/xtest_one.py", name, str(titerations), outputsdir)
130               
131                result = open("xtest1_report", "rt").readline().rstrip() or "crash"
132                error_status = max(error_status, states.index(result))
133                os.remove("xtest1_report")
134
135        os.chdir("..")
136
137    os.chdir(caller_directory)
138
139
140iterations = 3
141directories = []
142error_status = 0
143
144def usage():
145    """Print out help."""
146    print "%s [update|test|report|report-html|errors] -[h|s] [--single|--module=[orange|obi|text]|--dir=<dir>|] <files>" % sys.argv[0]
147    print "  test:   regression tests on all scripts"
148    print "  update: regression tests on all previously failed scripts (default)"
149    print "  report: report on testing results"
150    print "  errors: report on errors from regression tests"
151    print
152    print "-s, --single: runs a single test on each script"
153    print "--module=<module>: defines a module to test"
154    print "--dir=<dir>: a comma-separated list of names where any should match the directory to be tested"
155    print "<files>: space separated list of string matching the file names to be tested"
156   
157   
158def main(argv):
159    """Process the argument list and run the regression test."""
160    global iterations
161   
162    command = "update"
163    if argv:
164        if argv[0] in ["update", "test", "report", "report-html", "errors", "help"]:
165            command = argv[0]
166            del argv[0]
167
168    try:
169        opts, test_files = getopt.getopt(argv, "hs", ["single", "module=", "help", "files=", "verbose="])
170    except getopt.GetoptError:
171        print "Warning: Wrong argument"
172        usage()
173        sys.exit(1)
174    opts = dict(opts) if opts else {}
175    if "--single" in opts or "-s" in opts:
176        iterations = 1
177    if "--help" in opts or '-h' in opts:
178        usage()
179        sys.exit(0)
180   
181    module = opts.get("--module", "orange")
182    if module in ["orange"]:
183        root = "%s/doc" % orngEnviron.orangeDir
184        module = "orange"
185        dirs = [("modules", "modules"), ("reference", "reference"), ("ofb", "ofb-rst/code")]
186    elif module in ["ofb-rst"]:
187        root = "%s/doc" % orngEnviron.orangeDir
188        module = "orange"
189        dirs = [("ofb", "ofb-rst/code")]
190    elif module in ["orange25"]:
191        root = "%s/doc" % orngEnviron.orangeDir
192        module = "orange25"
193        dirs = [("orange25", "Orange/rst/code")]
194    elif module == "obi":
195        root = orngEnviron.addOnsDirSys + "/Bioinformatics/doc"
196        dirs = [("modules", "modules")]
197    elif module == "text":
198        root = orngEnviron.addOnsDirSys + "/Text/doc"
199        dirs = [("modules", "modules")]
200    else:
201        print "Error: %s is wrong name of the module, should be in [orange|obi|text]" % module
202        sys.exit(1)
203   
204    test_scripts(command=="test", command=="report" or (command=="report-html" and command or False), 
205                 module=module, root_directory=root,
206                 test_files=test_files, directories=dirs)
207    # sys.exit(error_status)
208   
209main(sys.argv[1:])
Note: See TracBrowser for help on using the repository browser.