Merge pull request #755 from wiredfool/multithread-testing-travis

Multithread testing- travis
This commit is contained in:
Alex Clark ☺ 2014-07-01 14:14:49 -04:00
commit febfe2f574
6 changed files with 72 additions and 56 deletions

View File

@ -9,3 +9,6 @@ exclude_lines =
# Don't complain if non-runnable code isn't run: # Don't complain if non-runnable code isn't run:
if 0: if 0:
if __name__ == .__main__.: if __name__ == .__main__.:
# Don't complain about debug code
if Image.DEBUG:
if DEBUG:

View File

@ -3,7 +3,7 @@ language: python
notifications: notifications:
irc: "chat.freenode.net#pil" irc: "chat.freenode.net#pil"
env: MAX_CONCURRENCY=4 env: MAX_CONCURRENCY=4 NOSE_PROCESSES=4 NOSE_PROCESS_TIMEOUT=30
python: python:
- "pypy" - "pypy"
@ -14,9 +14,9 @@ python:
- 3.4 - 3.4
install: install:
- "sudo apt-get -qq install libfreetype6-dev liblcms2-dev python-qt4 ghostscript libffi-dev libjpeg-turbo-progs cmake" - "sudo apt-get -qq install libfreetype6-dev liblcms2-dev python-qt4 ghostscript libffi-dev cmake"
- "pip install cffi" - "pip install cffi"
- "pip install coveralls nose pyroma" - "pip install coveralls nose pyroma nose-cov"
- if [ "$TRAVIS_PYTHON_VERSION" == "2.6" ]; then pip install unittest2; fi - if [ "$TRAVIS_PYTHON_VERSION" == "2.6" ]; then pip install unittest2; fi
# webp # webp
@ -35,10 +35,13 @@ script:
- if [ "$TRAVIS_PYTHON_VERSION" == "pypy" ]; then time nosetests Tests/test_*.py; fi - if [ "$TRAVIS_PYTHON_VERSION" == "pypy" ]; then time nosetests Tests/test_*.py; fi
# Cover the others # Cover the others
- if [ "$TRAVIS_PYTHON_VERSION" != "pypy" ]; then time coverage run --append --include=PIL/* selftest.py; fi - if [ "$TRAVIS_PYTHON_VERSION" != "pypy" ]; then coverage run --parallel-mode --include=PIL/* selftest.py; fi
- if [ "$TRAVIS_PYTHON_VERSION" != "pypy" ]; then time coverage run --append --include=PIL/* -m nose Tests/test_*.py; fi # write html report, then ignore. Coverage needs to be combined first
- if [ "$TRAVIS_PYTHON_VERSION" != "pypy" ]; then nosetests --with-cov --cov='PIL/' --cov-report=html Tests/test_*.py; fi
after_success: after_success:
- ls -l .coverage*
- coverage combine
- coverage report - coverage report
- coveralls - coveralls
- pip install pep8 pyflakes - pip install pep8 pyflakes

View File

@ -1,3 +1,5 @@
pre: pre:
virtualenv . virtualenv .
bin/pip install -r requirements.txt bin/pip install -r requirements.txt
@ -9,3 +11,32 @@ pre:
check-manifest check-manifest
pyroma . pyroma .
viewdoc viewdoc
clean:
python setup.py clean
rm PIL/*.so || true
find . -name __pycache__ | xargs rm -r
install:
python setup.py install
python selftest.py --installed
test: install
python test-installed.py
inplace: clean
python setup.py build_ext --inplace
coverage:
# requires nose-cov
coverage erase
coverage run --parallel-mode --include=PIL/* selftest.py
nosetests --with-cov --cov='PIL/' --cov-report=html Tests/test_*.py
# doesn't combine properly before report,
# writing report instead of displaying invalid report
rm -r htmlcov || true
coverage combine
coverage report
test-dep:
pip install coveralls nose nose-cov pep8 pyflakes

View File

@ -3,39 +3,30 @@ Helper functions.
""" """
from __future__ import print_function from __future__ import print_function
import sys import sys
import tempfile
import os
import glob
if sys.version_info[:2] <= (2, 6): if sys.version_info[:2] <= (2, 6):
import unittest2 as unittest import unittest2 as unittest
else: else:
import unittest import unittest
# This should be imported into every test_XXX.py file to report
# any remaining temp files at the end of the run.
def tearDownModule(): def tearDownModule():
import glob #remove me later
import os pass
import tempfile
temp_root = os.path.join(tempfile.gettempdir(), 'pillow-tests')
tempfiles = glob.glob(os.path.join(temp_root, "temp_*"))
if tempfiles:
print("===", "remaining temporary files")
for file in tempfiles:
print(file)
print("-"*68)
class PillowTestCase(unittest.TestCase): class PillowTestCase(unittest.TestCase):
currentResult = None # holds last result object passed to run method def __init__(self, *args, **kwargs):
_tempfiles = [] unittest.TestCase.__init__(self, *args, **kwargs)
self.currentResult = None # holds last result object passed to run method
def run(self, result=None): def run(self, result=None):
self.addCleanup(self.delete_tempfiles)
self.currentResult = result # remember result for use later self.currentResult = result # remember result for use later
unittest.TestCase.run(self, result) # call superclass run method unittest.TestCase.run(self, result) # call superclass run method
def delete_tempfiles(self): def delete_tempfile(self, path):
try: try:
ok = self.currentResult.wasSuccessful() ok = self.currentResult.wasSuccessful()
except AttributeError: # for nosetests except AttributeError: # for nosetests
@ -44,19 +35,12 @@ class PillowTestCase(unittest.TestCase):
if ok: if ok:
# only clean out tempfiles if test passed # only clean out tempfiles if test passed
import os
import os.path
import tempfile
for file in self._tempfiles:
try:
os.remove(file)
except OSError:
pass # report?
temp_root = os.path.join(tempfile.gettempdir(), 'pillow-tests')
try: try:
os.rmdir(temp_root) os.remove(path)
except OSError: except OSError:
pass pass # report?
else:
print("=== orphaned temp file: %s" %path)
def assert_almost_equal(self, a, b, msg=None, eps=1e-6): def assert_almost_equal(self, a, b, msg=None, eps=1e-6):
self.assertLess( self.assertLess(
@ -139,27 +123,13 @@ class PillowTestCase(unittest.TestCase):
self.assertTrue(found) self.assertTrue(found)
return result return result
def tempfile(self, template, *extra): def tempfile(self, template):
import os assert template[:5] in ("temp.", "temp_")
import os.path (fd, path) = tempfile.mkstemp(template[4:], template[:4])
import sys os.close(fd)
import tempfile
files = [] self.addCleanup(self.delete_tempfile, path)
root = os.path.join(tempfile.gettempdir(), 'pillow-tests') return path
try:
os.mkdir(root)
except OSError:
pass
for temp in (template,) + extra:
assert temp[:5] in ("temp.", "temp_")
name = os.path.basename(sys.argv[0])
name = temp[:4] + os.path.splitext(name)[0][4:]
name = name + "_%d" % len(self._tempfiles) + temp[4:]
name = os.path.join(root, name)
files.append(name)
self._tempfiles.extend(files)
return files[0]
# helpers # helpers

View File

@ -22,7 +22,8 @@ class TestFontPcf(PillowTestCase):
self.assertIsInstance(font, FontFile.FontFile) self.assertIsInstance(font, FontFile.FontFile)
self.assertEqual(len([_f for _f in font.glyph if _f]), 192) self.assertEqual(len([_f for _f in font.glyph if _f]), 192)
tempname = self.tempfile("temp.pil", "temp.pbm") tempname = self.tempfile("temp.pil")
self.addCleanup(self.delete_tempfile, tempname[:-4]+'.pbm')
font.save(tempname) font.save(tempname)
return tempname return tempname

View File

@ -20,5 +20,13 @@ if len(sys.argv) == 1:
if ('--no-path-adjustment' not in sys.argv) and ('-P' not in sys.argv): if ('--no-path-adjustment' not in sys.argv) and ('-P' not in sys.argv):
sys.argv.insert(1, '--no-path-adjustment') sys.argv.insert(1, '--no-path-adjustment')
if 'NOSE_PROCESSES' not in os.environ:
for arg in sys.argv:
if '--processes' in arg:
break
else: # for
sys.argv.insert(1, '--processes=-1') # -1 == number of cores
sys.argv.insert(1, '--process-timeout=30')
if __name__ == '__main__': if __name__ == '__main__':
nose.main() nose.main()