[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [29873] branches/soc-2010-leifandersen/ tests/render/run.py: Reogranized the code to make it much more moduler.
Leif Andersen
leif.a.andersen at gmail.com
Fri Jul 2 18:50:59 CEST 2010
Revision: 29873
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=29873
Author: leifandersen
Date: 2010-07-02 18:50:58 +0200 (Fri, 02 Jul 2010)
Log Message:
-----------
Reogranized the code to make it much more moduler.
Modified Paths:
--------------
branches/soc-2010-leifandersen/tests/render/run.py
Modified: branches/soc-2010-leifandersen/tests/render/run.py
===================================================================
--- branches/soc-2010-leifandersen/tests/render/run.py 2010-07-02 13:47:23 UTC (rev 29872)
+++ branches/soc-2010-leifandersen/tests/render/run.py 2010-07-02 16:50:58 UTC (rev 29873)
@@ -11,136 +11,118 @@
BLENDER_BIN = "blender"
-def render(filename):
- command = BLENDER_BIN + " -b " + os.path.join(sys.path[0], filename) + " -o " + os.path.join(sys.path[0], "output", (string.replace(filename, '.blend', '') + "_####")) + " -F PNG -x 1 -f 1"
- os.system(command)
- return os.path.join(sys.path[0], "output", string.replace(filename, '.blend', '_0001.png'))
+class RenderTestCase:
+ '''A Render Test Case. Steps must be run in order:
+ 1. Constructer
+ 2. Render Image (if it doesn't already exist)
+ 3. Setup Tests
+ 4. Save Diff'''
+ name = None
+ passed = None
+ good_path = None
+ blend_path = None
+ test_path = None
+ diff_path = None
+ bad_pixels = None
+ pixel_count = None
+ good_image = None
+ test_image = None
+ diff_image = None
-class TestImage(unittest.TestCase):
-
- im1 = None
- im2 = None
- diff = None
+ def __init__(self, blend_path, good_path, test_path):
+ self.blend_path = blend_path
+ self.good_path = good_path
+ self.name = os.path.split(blend_path)[1]
+ self.good_image = Image.open(good_path)
+ self.test_path = test_path
- def setUp(self):
- image_path1 = os.path.join(sys.path[0], 'render', string.replace(filename,'.blend', '.png'))
- image_path2 = os.path.join(sys.path[0], 'output', string.replace(filename, '.blend', '_0001.png'))
- self.im1 = Image.open(image_path1)
- self.im2 = Image.open(image_path2)
- self.diff = ImageChops.difference(self.im1, self.im2)
- self.diff.save(os.path.join(sys.path[0], 'output', string.replace(filename, '.blend', '_diff.png')) , "PNG")
+ def render_image(self):
+ command = BLENDER_BIN + " -b " + self.blend_path + " -o " + self.test_path + "_#### -F PNG -x 1 -f 1"
+ os.system(command)
+ self.test_path += '_0001.png'
+ self.test_image = Image.open(self.test_path)
- def test_diff(self):
- global bad_pixels
- global pixel_count
- bad_pixels = 0
- pixel_count = len(self.diff.histogram())
- for num in self.diff.histogram():
+ def setup_test(self):
+ self.diff_image = ImageChops.difference(self.good_image, self.test_image)
+ self.bad_pixels = 0
+ self.pixel_count = len(self.diff_image.histogram())
+ for num in self.diff_image.histogram():
if num > 300:
- bad_pixels+=1
- if bad_pixels > pixel_count/10:
- self.fail("Images are too different: " + str(bad_pixels))
+ self.bad_pixels+=1
+ if self.bad_pixels < self.pixel_count/10:
+ self.passed = True
+ else:
+ self.passed = False
+ return self.passed
+ def save_diff(self, output_path):
+ if self.diff_image != None:
+ self.diff_path = output_path
+ self.diff_image.save(output_path)
-# This class is only run use when being called from by the operator in blender.
-class TestImageOperator(unittest.TestCase):
- def setUp(self):
- pass
+def get_cases(folder):
+ '''Returns all of the blend files in the folder'''
+ cases = []
+ for filename in os.listdir(sys.path[0]):
+ if filename.find('.blend') != -1:
+ blend_path = os.path.join(sys.path[0],filename)
+ good_path = os.path.join(sys.path[0], 'render', string.replace(filename, '.blend', '.png'))
+ test_path = os.path.join(sys.path[0], 'output', string.replace(filename, '.blend', ''))
+ test_case = RenderTestCase(blend_path, good_path, test_path)
+ cases.append(test_case)
+ return cases
- def test_image(self):
- if len(sys.argv) < 3:
- self.fail("Please don't use this script")
- image_path1 = sys.argv[2]
- image_path2 = sys.argv[3]
- im1 = Image.open(image_path1)
- im2 = Image.open(image_path2)
- im1_red = im1_green = im1_blue = im2_red = im2_green = im2_blue = 0
+def console_output(cases):
+ failed = []
+ for test_case in cases:
+ if test_case.passed == False:
+ failed.append(test_case)
- self.assertEquals(im1.size, im2.size)
- for i in range(0, im1.size[0]):
- for j in range(0, im1.size[1]):
- im1_red+=im1.getpixel((i,j))[0]
- im1_green+=im1.getpixel((i,j))[1]
- im1_blue+=im1.getpixel((i,j))[2]
- im2_red+=im2.getpixel((i,j))[0]
- im2_green+=im2.getpixel((i,j))[1]
- im2_blue+=im2.getpixel((i,j))[2]
+ print "The following tesets failed:"
+ for test_case in failed:
+ print test_case.name
- im_red = abs(im1_red-im2_red)
- im_green = abs(im1_green-im2_green)
- im_blue = abs(im1_blue-im2_blue)
+def generate_output(images):
+ file = open(os.path.join(sys.path[0],"index.html"), "w")
+ file.write('<html><head><title>Render Test Output</title></head>\n')
+ file.write('<body>\n')
+ file.write('<div class="noprint" id="navcontainer"><a href="http://www.blender.org/"><img width="140" height="50" title="blender.org home page" alt="blender.org home page" src="http://www.blender.org/fileadmin/site/_gfx/nav-home.png"></a><a href="http://www.blender.org/features-gallery/"><img width="140" height="50" title="Features & Gallery" alt="Features & Gallery" src="http://www.blender.org/fileadmin/site/_gfx/nav-features.png"></a><a href="http://www.blender.org/download/get-blender/"><img width="140" height="50" title="Download" alt="Download" src="http://www.blender.org/fileadmin/site/_gfx/nav-download.png"></a><a href="http://www.blender.org/education-help/"><img width="140" height="50" title="Tutorials & Help" alt="Tutorials & Help" src="http://www.blender.org/fileadmin/site/_gfx/nav-help.png"></a><a href="http://www.blender.org/community/user-community/"><img width="140" height="50" title="Community" alt="Community" src="http://www.blender.org/fileadmin/site/_gfx/nav-community.png"></a><a href="http://www.blender.org/development/"><img width="140" height="50" title="Development" alt="Development" src="http://www.blender.org/fileadmin/site/_gfx/nav-development-on.png"></a><a href="http://www.blender.org/e-shop/"><img width="140" height="50" title="e-Shop" alt="e-Shop" src="http://www.blender.org/fileadmin/site/_gfx/nav-eshop.png"></a></div> ')
+ file.write('<table border="1">\n')
+ file.write('<tr>\n')
+ file.write('<th>Filename</th>\n')
+ file.write('<th>Good Image</th>\n')
+ file.write('<th>Latest Render</th>\n')
+ file.write('<th>Diff</th>\n')
+ file.write('<th>Match?</th>\n')
+ file.write('</tr>\n')
- if im_red > 100 or im_green > 100 or im_blue > 100:
- self.fail("Images are too different")
+ for image in images:
+ file.write('<tr>\n')
+ file.write('<td>' + image.name + '</td>\n')
+ file.write('<td><img src="' + os.path.join('render', string.replace(image.name, '.blend', '.png')) + '" alt="Good Image" width="200" height="150"></td>\n')
+ file.write('<td><img src="' + os.path.join('output', string.replace(image.name, '.blend', '_0001.png')) + '" alt="Latest Render" width="200" height="150"></td>\n')
+ file.write('<td><img src="' + os.path.join('output', string.replace(image.name, '.blend', '_diff.png')) + '" alt="Image Diff" width="200" height="150"></td>\n')
+ if image.passed:
+ file.write('<td><font color="ooffoo">OK</font>: ' + str(image.bad_pixels) + ' of ' + str(image.pixel_count) + ' pixels different</td>\n')
+ else:
+ file.write('<td><font color="ff0000">FAIL</font>: ' + str(image.bad_pixels) + ' of ' + str(image.pixel_count) + ' pixels different</td>\n')
+ file.write('</tr>\n')
+ file.write('</table>\n</body>\n</html>')
+ file.close()
-def suite():
- return unittest.TestSuite([
-unittest.TestLoader().loadTestsFromTestCase(TestImage),
-])
-
-def operator_suite():
- return unittest.TestSuite([
-unittest.TestLoader().loadTestsFromTestCase(TestImageOperator),
-])
-
if __name__ == "__main__":
- passed = []
- failed = []
- if len(sys.argv) > 1 and sys.argv[1] == '--blender-intern':
- # If this is run in blender, than the images already exist
- # and only comparisons need to take place.
- unittest.TextTestRunner(verbosity=2).run(operator_suite())
- else:
- # Otherwise render the tests, and generate HTML output
+ cases = get_cases(sys.path[0])
+ cases.sort(key=lambda case: case.name)
+ for test_case in cases:
+ print test_case.name
+ test_case.render_image()
+ test_case.setup_test()
+ test_case.save_diff(os.path.join(sys.path[0], 'output', string.replace(test_case.name, '.blend', '_diff.png')))
+ print test_case.passed
- #Setting up the HTML File
- file = open(os.path.join(sys.path[0],"index.html"), "w")
- file.write('<html><head><title>Render Test Output</title></head>\n')
- file.write('<body>\n')
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list