ColorTextTestRunner   A
last analyzed

Complexity

Total Complexity 17

Size/Duplication

Total Lines 77
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
dl 0
loc 77
rs 10
c 0
b 0
f 0
wmc 17

3 Methods

Rating   Name   Duplication   Size   Complexity  
A __init__() 0 6 1
F write_end() 0 40 12
B run() 0 28 4
1
'''
2
Created on Sep 23, 2013
3
4
@author: sean
5
'''
6
from unittest.runner import TextTestRunner, TextTestResult
7
from unittest.signals import registerResult
8
import time
9
import sys
10
11
WARNING = '\033[33m'
12
OKBLUE = '\033[34m'
13
OKGREEN = '\033[32m'
14
FAIL = '\033[31m'
15
ENDC = '\033[0m'
16
BOLD = "\033[1m"
17
18
def green(text):
19
    return BOLD + OKGREEN + text + ENDC
20
21
def red(text):
22
    return BOLD + FAIL + text + ENDC
23
24
def orange(text):
25
    return WARNING + text + ENDC
26
27
def blue(text):
28
    return OKBLUE + text + ENDC
29
30
class ColorTextTestResult(TextTestResult):
31
    def addSuccess(self, test):
32
        super(TextTestResult, self).addSuccess(test)
33
        if self.showAll:
34
            self.stream.writeln(green("ok"))
35
        elif self.dots:
36
            self.stream.write('.')
37
            self.stream.flush()
38
39
    def addError(self, test, err):
40
        super(TextTestResult, self).addError(test, err)
41
        if self.showAll:
42
            self.stream.writeln(red("ERROR"))
43
        elif self.dots:
44
            self.stream.write(red('E'))
45
            self.stream.flush()
46
47
    def addFailure(self, test, err):
48
        super(TextTestResult, self).addFailure(test, err)
49
        if self.showAll:
50
            self.stream.writeln(red("FAIL"))
51
        elif self.dots:
52
            self.stream.write(red('F'))
53
            self.stream.flush()
54
55
    def addSkip(self, test, reason):
56
        super(TextTestResult, self).addSkip(test, reason)
57
        if self.showAll:
58
            self.stream.writeln(blue("skipped {0!r}".format(reason)))
59
        elif self.dots:
60
            self.stream.write(blue("s"))
61
            self.stream.flush()
62
63
    def addExpectedFailure(self, test, err):
64
        super(TextTestResult, self).addExpectedFailure(test, err)
65
        if self.showAll:
66
            self.stream.writeln(blue("expected failure"))
67
        elif self.dots:
68
            self.stream.write(blue("x"))
69
            self.stream.flush()
70
71
    def addUnexpectedSuccess(self, test):
72
        super(TextTestResult, self).addUnexpectedSuccess(test)
73
        if self.showAll:
74
            self.stream.writeln(blue("unexpected success"))
75
        elif self.dots:
76
            self.stream.write(blue("u"))
77
            self.stream.flush()
78
79
    def printErrors(self):
80
        if self.dots or self.showAll:
81
            self.stream.writeln()
82
        self.printErrorList(red('ERROR'), self.errors)
83
        self.printErrorList(red('FAIL'), self.failures)
84
85
class ColorTextTestRunner(TextTestRunner):
86
87
    def __init__(self, stream=sys.stderr, descriptions=True, verbosity=1,
88
        failfast=False, buffer=False, resultclass=ColorTextTestResult):
89
        
90
        TextTestRunner.__init__(self, stream=stream, descriptions=descriptions,
91
                                verbosity=verbosity, failfast=failfast, buffer=buffer,
92
                                resultclass=resultclass)
93
    def run(self, test):
94
        "Run the given test case or test suite."
95
        result = self._makeResult()
96
        registerResult(result)
97
        result.failfast = self.failfast
98
        result.buffer = self.buffer
99
        startTime = time.time()
100
        startTestRun = getattr(result, 'startTestRun', None)
101
        if startTestRun is not None:
102
            startTestRun()
103
        try:
104
            test(result)
105
        finally:
106
            stopTestRun = getattr(result, 'stopTestRun', None)
107
            if stopTestRun is not None:
108
                stopTestRun()
109
        stopTime = time.time()
110
        timeTaken = stopTime - startTime
111
        result.printErrors()
112
        if hasattr(result, 'separator2'):
113
            self.stream.writeln(result.separator2)
114
        run = result.testsRun
115
        self.stream.writeln("Ran %d test%s in %.3fs" % 
116
                            (run, run != 1 and "s" or "", timeTaken))
117
        self.stream.writeln()
118
119
120
        return result
121
    
122
    def write_end(self, result, coverage):
123
        
124
        expectedFails = unexpectedSuccesses = skipped = 0
125
        try:
126
            results = map(len, (result.expectedFailures,
127
                                result.unexpectedSuccesses,
128
                                result.skipped))
129
        except AttributeError:
130
            pass
131
        else:
132
            expectedFails, unexpectedSuccesses, skipped = results
133
            
134
        infos = []
135
        if not result.wasSuccessful():
136
            self.stream.write('Tests: ' + red("FAILED"))
137
            failed, errored = map(len, (result.failures, result.errors))
138
            if failed:
139
                infos.append("failures=%d" % failed)
140
            if errored:
141
                infos.append("errors=%d" % errored)
142
        else:
143
            self.stream.write('Tests: ' + green("OK"))
144
        if skipped:
145
            infos.append("skipped=%d" % skipped)
146
        if expectedFails:
147
            infos.append("expected failures=%d" % expectedFails)
148
        if unexpectedSuccesses:
149
            infos.append("unexpected successes=%d" % unexpectedSuccesses)
150
        if infos:
151
            self.stream.write(" (%s)" % (", ".join(infos),))
152
            
153
        perc = coverage.pc_covered
154
        color = green
155
        if perc < 80:
156
            color = blue
157
        if perc < 50:
158
            color = red
159
        
160
        cv = color("%i%%" % (int(coverage.pc_covered)))
161
        self.stream.write(", Coverage: %s \n" % (cv))
162
        
163
        
164