A Faster Django Test Suite pasted by brosner, 21:18 March 25th

‣ New

Syntax: Python
    ‣ Plain   ‣ HTML   ‣ Copy
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
def run_tests_faster(test_labels, verbosity=1, interactive=True, extra_tests=[]):
    from Queue import Empty
    from processing import Queue, cpuCount, enableLogging
    from processing import currentProcess, Process, freezeSupport
    
    #enableLogging()
    
    # the number of processes to run in parallel.
    num_processes = cpuCount()
    
    def process_print(msg):
        print "%s: %s" % (currentProcess().getName(), msg)
    
    def worker(old_name, verbosity, interactive, ready_queue, app_queue, done_queue):
        process_print("setting up environment")
        setup_test_environment()
        create_test_db(verbosity, autoclobber=not interactive)
        ready_queue.put(1)
        for app_label in iter(app_queue.get, "STOP"):
            process_print(app_label)
            suite = build_suite(get_app(app_label))
            result = unittest.TestResult()
            suite.run(result)
            done_queue.put((app_label, len(result.failures), len(result.errors)))
            # done_queue.put((app_label, 0, 0)) # FOR TESTING
        process_print("tearing down environment")
        destroy_test_db(old_name, verbosity)
        teardown_test_environment()
    
    ready_queue = Queue()
    app_queue = Queue()
    done_queue = Queue()
    apps = []
    
    for installed_app in settings.INSTALLED_APPS:
        apps.append(installed_app.split(".")[-1])
    
    for i in range(num_processes):
        Process(target=worker, args=[settings.DATABASE_NAME, verbosity, interactive, ready_queue, app_queue, done_queue]).start()
    
    ready_count = 0
    done_apps = []
    total_failures = 0
    total_errors = 0
    
    while ready_count != num_processes:
        ready_queue.get()
        ready_count += 1
    
    print "start timer"
    start_time = time.time()
    app_queue.putmany(apps)
    
    while len(apps) != len(done_apps):
        app_label, failures, errors = done_queue.get()
        total_failures += failures
        total_errors += errors
        done_apps.append(app_label)
    
    stop_time = time.time()
    print "timer ended"
    time_taken = stop_time - start_time
    
    for i in range(num_processes):
        app_queue.put("STOP")
    
    print "time: %.3fs, failures: %d, errors: %d" % (time_taken, total_failures, total_errors)
    
    # give the workers some time to finish
    time.sleep(2)
    
    return 0
This item will be deleted in 179 days
URL: http://dpaste.com/hold/41314/
‣ About this site