execfile() did the trick! Things are working nicely now. Using a test database would be very helpful. How do you recommend setting one up? Do I need to copy/paste the table/field definitions from the 'db' object, or is there a way to make a copy of the 'db' object and point it to a different SQLite file?
On Feb 24, 10:54 pm, Thadeus Burgess <thade...@thadeusb.com> wrote: > The unit test already has access to web2py environment (and db or > anything else in your models). ``exec_environment`` just recreates a > blank environment, when executing your controller it executes it > outside of the current global scope. > > Instead of running exec_environment on your controller, run > ``execfile('/path/to/file', globals())``. This way the controller is > executed in the current environment instead of a new one. > > The objects for Request Storage and Response don't exist even to your > web2py app, you always have to import them if you are using them. So > if you wanted to use Storage even in your models you would need an > "from gluon.storage import Storage" somewhere. > > Do you want your unit tests to work on your actual database? Usually I > define a test.sqlite database that has > nothing in it, and during my tests gets data inserted, altered, and > then removed at the end of the tests. > > -Thadeus > > On Wed, Feb 24, 2010 at 9:35 PM, spiffytech <spiffyt...@gmail.com> wrote: > > Thanks! Interesting article! My test cases now execute. However, I > > have a couple new questions, including a problem accessing the db in > > my controller. > > > I modified my test file as AlterEgo 213 indicates so my unit tests can > > access the controller's functions. Here is my updated test file: > > > ============== > > #!/usr/bin/python > > import sys > > import unittest > > > from gluon.shell import exec_environment > > from gluon.globals import Request, Response, Session > > from gluon.storage import Storage > > > sys.arvg = sys.argv[5:] # web2py.py passes the whole command line to > > this script > > > class TestListActiveGames(unittest.TestCase): > > def setUp(self): > > self.request = Request() # Use a clean Request > > self.controller = exec_environment('applications/api/ > > controllers/10.py', request=self.request) > > > def testListActiveGames(self): > > self.request.post_vars["game_id"] = 1 > > self.request.post_vars["username"] = "spiffytech" > > self.controller.list_active_games() > > > suite = unittest.TestSuite() > > suite.addTest(unittest.makeSuite(TestListActiveGames)) > > unittest.TextTestRunner(verbosity=2).run(suite) > > ============== > > > It is called with the command: > > > ============== > > python web2py.py -S api -M -R applications/api/tests/test.py > > ============== > > > The output is this: > > > ============== > > web2py Enterprise Web Framework > > Created by Massimo Di Pierro, Copyright 2007-2010 > > Version 1.75.4 (2010-02-18 20:57:56) > > Database drivers available: pysqlite2 > > testListActiveGames (__builtin__.TestListActiveGames) ... ERROR > > > ====================================================================== > > ERROR: testListActiveGames (__builtin__.TestListActiveGames) > > ---------------------------------------------------------------------- > > Traceback (most recent call last): > > File "applications/api/tests/test.py", line 19, in > > testListActiveGames > > self.controller.list_active_games() > > File "applications/api/controllers/10.py", line 47, in > > list_active_games > > games = db(((db.game.user1==username)|(db.game.user2==username)) & > > (db.game.victory==-2)).select(db.game.user1, db.game.user2, > > db.game.id, db.game.turn_number).as_list() > > NameError: global name 'db' is not defined > > > ---------------------------------------------------------------------- > > Ran 1 test in 0.008s > > > FAILED (errors=1) > > ============== > > > Questions: > > 1) How can I get my controller to see the database? > > 2) Am I simply doing something very wrong? I would expect the web2py "- > > S" option to set up the environment, complete with my controller's > > functions, and Request/Storage/Response objects available for > > instantiation. However, several posts on the mailing list indicate > > that I need to run exec_enviroment() for access to my controllers. > > Also, the Request/Storage/Response objects don't seem to exist in the > > shell. > > > On Feb 24, 2:52 pm, Thadeus Burgess <thade...@thadeusb.com> wrote: > >> Replacing the way you run test suites helps. Instead of using .main() > >> add them manually. > > >> I would suggest reading the following article, as it includes methods > >> to aggregate your test suites together. > > >>http://agiletesting.blogspot.com/2005/01/python-unit-testing-part-1-u... > > >> import sys > >> sys.argv = sys.argv[5:] > > >> import unittest > > >> class TestDefaultController(unittest.TestCase): > > >> def testPrintStatement(self): > >> print "This line should print" > >> def testDatabaseRecordCount(self): > >> print "Records in database --- ", db(db.auth_user.id>0).count() > > >> suite = unittest.TestSuite() > >> suite.addTest(unittest.makeSuite(TestDefaultController)) > >> unittest.TextTestRunner(verbosity=2).run(suite) > > >> python web2py.py -S pms -M -R > >> applications/pms/test/testDefaultController.py > >> web2py Enterprise Web Framework > >> Created by Massimo Di Pierro, Copyright 2007-2010 > >> Version 1.75.4 (2010-02-18 14:55:03) > >> Database drivers available: SQLite3 > >> /home/thadeusb/web2py/applications/pms/modules/utils.py:16: > >> DeprecationWarning: the md5 module is deprecated; use hashlib instead > >> import md5 > >> testDatabaseRecordCount (__builtin__.TestDefaultController) ... > >> Records in database --- 4052 > >> ok > >> testPrintStatement (__builtin__.TestDefaultController) ... This line > >> should print > >> ok > > >> ---------------------------------------------------------------------- > >> Ran 2 tests in 0.006s > > >> OK > > >> -Thadeus > > >> On Wed, Feb 24, 2010 at 12:50 PM, spiffytech <spiffyt...@gmail.com> wrote: > >> > The confusion is not with doctests, but with external unit tests > >> > created with the 'unittest' module. Could you please post your > >> > testControllerDefault.py so I can see what you're doing different from > >> > me? > > >> > Please allow me to elaborate on my problems running unit tests with > >> > web2py. Here is my (very minimal) example unit test file: > >> > ================= > >> > #!/usr/bin/python > >> > import unittest > > >> > class TestListActiveGames(unittest.TestCase): > >> > def testListActiveGames(self): > >> > print "This line should print out" > > >> > if __name__ == "__main__": > >> > unittest.main() > >> > ================= > > >> > If the test is actually run, the command line will show "This line > >> > should print out". > > >> > The file is stored at <web2py_root>/applications/api/tests/test.py. My > >> > current working directory is <web2py_root>. > >> > I run the following command: > > >> > ======= > >> > python web2py.py -S api -M -R applications/api/tests/test.py > >> > ======= > > >> > And I get this output: > > >> > ================ > >> > web2py Enterprise Web Framework > >> > Created by Massimo Di Pierro, Copyright 2007-2010 > >> > Version 1.75.4 (2010-02-18 20:57:56) > >> > Database drivers available: pysqlite > >> > ================ > > >> > The output does not contain the line, "This line should print out", > >> > indicating the unit tests are not being run. > > >> > I did some debugging and found that the last two lines, which are > >> > typical for unittest files, do not work when the file is executed by > >> > web2py. Rather than being equal to "__main__", which indicates the > >> > file is being executed from the command line, __name__ is equal to > >> > "__builtin__". I modified the code to work anyway: > > >> > ================ > >> > #!/usr/bin/python > >> > import unittest > > >> > class TestListActiveGames(unittest.TestCase): > >> > def testListActiveGames(self): > >> > print "This line should print out" > > >> > unittest.main() > >> > ================ > > >> > Now, I receive this output: > > >> > ======= > >> > web2py Enterprise Web Framework > >> > Created by Massimo Di Pierro, Copyright 2007-2010 > >> > Version 1.75.4 (2010-02-18 20:57:56) > >> > Database drivers available: pysqlite2 > >> > option -S not recognized > >> > Usage: web2py.py [options] [test] [...] > > >> > Options: > >> > -h, --help Show this message > >> > -v, --verbose Verbose output > >> > -q, --quiet Minimal output > > >> > Examples: > >> > web2py.py - run default set of tests > >> > web2py.py MyTestSuite - run suite 'MyTestSuite' > >> > web2py.py MyTestCase.testSomething - run > >> > MyTestCase.testSomething > >> > web2py.py MyTestCase - run all 'test*' test > >> > methods > >> > in MyTestCase > >> > ======= > > >> > More debugging revealed that this is output by unittest.main(). The > >> > unittest module tries to parse arguments on the command line, sees the > >> > "-S" option that was passed to web2py.py, says "I don't know what '-S' > >> > means!", and exits. > > >> > To coerce unittest.main() to continue running, I made a quick hack to > >> > shell.py to strip out the extra command line arguments in sys.argv > >> > before test.py is run: > > >> > ==== gluon/shell.py, insert line 165 ==== > >> > sys.argv = sys.argv[5:] > >> > =================== > > >> > I call the test file again, with the same command as before, and get > >> > this: > > >> > ================ > >> > web2py Enterprise Web Framework > >> > Created by Massimo Di Pierro, Copyright 2007-2010 > >> > Version 1.75.4 (2010-02-18 20:57:56) > >> > Database drivers available: pysqlite2 > > >> > ---------------------------------------------------------------------- > >> > Ran 0 tests in 0.000s > > >> > OK > >> > ================ > > >> > The line, "This line should be printed out", is still not printed. > >> > Stepping through the code with Python's debugging module, pdb, shows > >> > that unittest.main() thinks it's being called from web2py.py, and not > >> > from test.py. unittest.main() looks for tests to run in web2py.py, > >> > finds none, and quits. > > >> > So now I'm stuck: the unittest module expects test.py to be run as a > >> > standalone script, but instead test.py is being executed within the > >> > scope of web2py.py, which is confusing the unittest module in several > > ... > > read more » -- You received this message because you are subscribed to the Google Groups "web2py-users" group. To post to this group, send email to web...@googlegroups.com. To unsubscribe from this group, send email to web2py+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/web2py?hl=en.