- From: Olivier Thereaux via cvs-syncmail <cvsmail@w3.org>
- Date: Mon, 28 Jan 2008 02:19:31 +0000
- To: www-validator-cvs@w3.org
Update of /sources/public/2008/link-testsuite/harness In directory hutz:/tmp/cvs-serv28821 Added Files: linktest.py Log Message: main script for the link test harness * python-based * developed with unit-testing. run in "sanity" mode after any modification to the code or test cases * can be extended to use other link checkers, spiders etc. --- NEW FILE: linktest.py --- #!/usr/bin/env python # encoding: utf-8 """ link-testsuite/harness/run.py Run or Generate test suite for link checkers Created by olivier Thereaux on 2008-01-23. Copyright (c) 2008 W3C. Licensed under the W3C Software License http://www.w3.org/Consortium/Legal/copyright-software """ import os import sys import glob import getopt import unittest import re import xml.etree.cElementTree as ET basedir = os.path.dirname(os.path.abspath(__file__)) sys.path.append(os.path.join(basedir, "lib")) from W3CLinkCheckerClient import W3CLinkCheckerClient, W3CLinkCheckerClient_UT from LinkTestCase import LinkTestCase, LinkTestCase_UT, LinkTestCollection help_message = ''' Run or Generate test suite for link checkers Usage: linktest.py [options] [run|sanity|doc] Options: -h, --help: this manual you are reading -v, --verbose: verbose output -q, --quiet: suppress all output except errors Modes: run: run the link checker test suite sanity: check that this code is still working useful after using test cases or modifying code doc: generate an HTML index of the test cases ''' class Usage(Exception): def __init__(self, msg): self.msg = msg class TestRun(unittest.TestCase): def test_1_1_readTestCase(self): """Opening and parsing a Test Case file (basic)""" basedir = getBaseDir() test_file = os.path.join(basedir, 'sample', 'sample.test') sample_test = readTestCase(test_file) self.assert_(isinstance(sample_test, LinkTestCase)) def test_1_2_readTestCase(self): """Opening and parsing a Test Case file (values)""" basedir = getBaseDir() test_file = os.path.join(basedir, 'sample', 'sample.test') sample_test = readTestCase(test_file) self.assertEqual( (sample_test.title, sample_test.description, sample_test.docURI, sample_test.runOptions, sample_test.expectResults), (u"Sample Test case for a 404", u'''The document links to a 404 not found resource.\n The checker should report the broken link''', "http://qa-dev.w3.org/link-testsuite/http-404.html", {}, {"404": "http://qa-dev.w3.org/link-testsuite/http.php?code=404"}) ) def test_1_3_readTestCase(self): """Ill-formed test case files should throw an exception""" basedir = getBaseDir() test_file = os.path.join(basedir, 'sample', 'sampleillformed.test') self.assertRaises(SyntaxError, readTestCase, test_file) def test_2_1_readCollectionMeta(self): """Opening and parsing a Test Collection metadata file (basic)""" basedir = getBaseDir() collection_file = os.path.join(basedir, 'sample', 'sample.collection') sample_collection = readCollectionMeta(collection_file) self.assert_(isinstance(sample_collection, LinkTestCollection)) def test_2_2_readCollectionMeta(self): """Opening and parsing a Test Collection metadata file (values)""" basedir = getBaseDir() collection_file = os.path.join(basedir, 'sample', 'sample.collection') sample_collection = readCollectionMeta(collection_file) self.assertEqual( (sample_collection.title, sample_collection.description, sample_collection.cases), (u"test", u"Sample Collection with one test", ["sample.test"]) ) def test_3_buildTestCollection(self): """Test building a Test Collection""" basedir = getBaseDir() collection_file = os.path.join(basedir, 'sample', 'sample.collection') sample_collection = readCollectionMeta(collection_file) for testcase_file in sample_collection.cases: test_file = os.path.join(basedir, 'sample', testcase_file) sample_test = readTestCase(test_file) self.assertEqual( (sample_test.title, sample_test.description, sample_test.docURI, sample_test.runOptions, sample_test.expectResults), (u"Sample Test case for a 404", u'''The document links to a 404 not found resource.\n The checker should report the broken link''', "http://qa-dev.w3.org/link-testsuite/http-404.html", {}, {"404": "http://qa-dev.w3.org/link-testsuite/http.php?code=404"}) ) def test_4_buildTestSuite(self): """Test building the whole Link Checker Test Suite""" suite = buildTestSuite() pass def main(argv=None): verbose=1 if argv is None: argv = sys.argv try: try: opts, args = getopt.getopt(argv[1:], "ho:vq", ["help", "verbose", "quiet"]) for (opt, value) in opts: if opt == "h" or opt == "--help": raise Usage(msg) except getopt.error, msg: raise Usage(msg) # option processing for option, value in opts: if option == "-v" or opt == "--verbose": verbose = 2 if option == "-q" or opt == "--quiet": verbose = 0 if option in ("-h", "--help"): raise Usage(help_message) if option in ("-o", "--output"): output = value if len(args) == 0: raise Usage(help_message) except Usage, err: print >> sys.stderr, sys.argv[0].split("/")[-1] + ": " + str(err.msg) print >> sys.stderr, "\t for help use --help" return 2 if args[0] == "run": suite = buildTestSuite() unittest.TextTestRunner(verbosity=verbose).run(suite) elif args[0] == "sanity": suite1 = unittest.TestLoader().loadTestsFromTestCase(W3CLinkCheckerClient_UT) suite2 = unittest.TestLoader().loadTestsFromTestCase(LinkTestCase_UT) suite3 = unittest.TestLoader().loadTestsFromTestCase(TestRun) suite = unittest.TestSuite([suite1, suite2, suite3]) unittest.TextTestRunner(verbosity=verbose).run(suite) elif args[0] == "doc": pass def getBaseDir(): basedir = os.path.dirname(os.path.abspath(__file__)) return basedir def readTestCase(test_file): test_file_handle = open(test_file, 'r') try: tree = ET.parse(test_file_handle) except SyntaxError, v: raise v title = tree.findtext("title") if title: title = title.decode("utf-8") else: title = None descr = tree.findtext("description") if descr: descr = descr.decode("utf-8") else: descr = None doc_elt = tree.find(".//doc") if doc_elt.attrib.has_key("href"): test_uri = doc_elt.attrib["href"] else: test_uri = None options_elt = tree.find(".//options") ## TODO expect_elt = tree.find(".//expect") expected = dict() if expect_elt.getchildren(): for child in expect_elt.findall("report"): if child.attrib.has_key("href") and child.attrib.has_key("code"): if expected.has_key(child.tag): expected[child.attrib["code"]].append(child.attrib["href"]) else: expected[child.attrib["code"]] = (child.attrib["href"]) case = LinkTestCase(title=title, description=descr, docURI=test_uri, runOptions=None, expectResults=expected) return case def readTestCollection(collection_path): basedir = getBaseDir() for metafile in glob.glob(os.path.join(collection_path, '*.collection')): collection = readCollectionMeta(metafile) for testfile in (glob.glob(os.path.join(collection_path, '*.test'))): case = readTestCase(test_file) collection.cases def readCollectionMeta(collection_file): collection_file_handle = open(collection_file, 'r') try: tree = ET.parse(collection_file_handle) except SyntaxError, v: raise v title = tree.findtext("title") if title: title = title.decode("utf-8") else: title = u"" description = tree.findtext("description") if description: description = description.decode("utf-8") else: description = u"" tests = list() for test in tree.findall("testcase"): if test.attrib.has_key("src"): tests.append(test.attrib["src"]) else: tests.append(test.tag) collection = LinkTestCollection(title=title, description=description, cases=tests) return collection def buildTestSuite(): suite = unittest.TestSuite() basedir = getBaseDir() for testcollection_file in (glob.glob(os.path.join(basedir, 'testcases', '**', '*.collection'))): colldir = os.path.dirname(os.path.abspath(testcollection_file)) colldir = os.path.split(colldir)[-1] testcollection = readCollectionMeta(testcollection_file) for testfile in testcollection.cases: case = readTestCase(os.path.join(basedir, 'testcases',colldir,testfile)) suite.addTest(case) return suite if __name__ == "__main__": sys.exit(main())
Received on Monday, 28 January 2008 02:19:44 UTC