Pisuję to samouczek w Web2py, gdzie można wykonać środowisko testowe. Jednak kiedy próbuję uruchomić test z nieokiełym, selenem, otrzymuję ten błąd:

$ python functional_tests.py
running tests
Traceback (most recent call last):
  File "functional_tests.py", line 56, in <module>
    run_functional_tests()
  File "functional_tests.py", line 46, in run_functional_tests
    tests = unittest.defaultTestLoader.discover('fts')
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/unittest/loader.py", line 202, in discover
    raise ImportError('Start directory is not importable: %r' % start_dir)
ImportError: Start directory is not importable: 'fts'

Tak wygląda funkcjonalne_tests.py:

#!/usr/bin/env python
try: import unittest2 as unittest #for Python <= 2.6
except: import unittest
import sys, urllib2
sys.path.append('./fts/lib')
from selenium import webdriver
import subprocess
import sys
import os.path

ROOT = 'http://localhost:8001'

class FunctionalTest(unittest.TestCase):

    @classmethod
    def setUpClass(self):
        self.web2py = start_web2py_server()
        self.browser = webdriver.Firefox()
        self.browser.implicitly_wait(1)

    @classmethod    
    def tearDownClass(self):
        self.browser.close()
        self.web2py.kill()

    def get_response_code(self, url):
        """Returns the response code of the given url

        url     the url to check for 
        return  the response code of the given url
        """
        handler = urllib2.urlopen(url)
        return handler.getcode()


def start_web2py_server():
    #noreload ensures single process
    print os.path.curdir    
    return subprocess.Popen([
            'python', '../../web2py.py', 'runserver', '-a "passwd"', '-p 8001'
    ])

def run_functional_tests(pattern=None):
    print 'running tests'
    if pattern is None:
        tests = unittest.defaultTestLoader.discover('fts')
    else:
        pattern_with_globs = '*%s*' % (pattern,)
        tests = unittest.defaultTestLoader.discover('fts', pattern=pattern_with_globs)

    runner = unittest.TextTestRunner()
    runner.run(tests)

if __name__ == '__main__':
    if len(sys.argv) == 1:
        run_functional_tests()
    else:
        run_functional_tests(pattern=sys.argv[1])
0
Philip 10 wrzesień 2012, 15:38

2 odpowiedzi

Najlepsza odpowiedź

Miałem ten sam problem i na podstawie doskonałego artykułu Testowanie jednostki z Web2PY, Dostałem to do pracy, wykonując następujące czynności:

  1. Utwórz folder testów w katalogu Tukker
  2. Kopiuj / Zapisz zmieniony kod (poniżej) w folderze testów jako alt_funkcjonalistki_tests.py
  3. Zmień ścieżkę Web2py w funkcji START_WEB2PY_SERVER na własną ścieżkę
  4. Aby uruchomić, wprowadź polecenie: Python Web2py.py -s Tukker -M -R Applications / Tukker / Tests / Alt_funkcjonalne_tests.py

Nie jestem ekspertem, ale mam nadzieję, że to zadziała również dla ciebie.


import unittest

from selenium import webdriver

import subprocess

import urllib2


execfile("applications/tukker/controllers/default.py", globals())

ROOT = 'http://localhost:8001'

def start_web2py_server():
    return subprocess.Popen([
        'python', '/home/alan/web2py/web2py/web2py.py', 'runserver',
         '-a "passwd"', '-p 8001' ])

class FunctionalTest(unittest.TestCase):

    @classmethod
    def setUpClass(self):
        self.web2py = start_web2py_server()
        self.browser = webdriver.Firefox()
        self.browser.implicitly_wait(1)

    @classmethod    
    def tearDownClass(self):
        self.browser.close()
        self.web2py.kill()

    def get_response_code(self, url):
        """Returns the response code of the given url
        url     the url to check for 
        return  the response code of the given url
        """
        handler = urllib2.urlopen(url)
        return handler.getcode()

    def test_can_view_home_page(self):
        # John opens his browser and goes to the home-page of the tukker app
        self.browser.get(ROOT + '/tukker/')
        # He's looking at homepage and sees Heading "Messages With 300 Chars"
        body = self.browser.find_element_by_tag_name('body')
        self.assertIn('Messages With 300 Chars', body.text)

suite = unittest.TestSuite()
suite.addTest(unittest.makeSuite(FunctionalTest))
unittest.TextTestRunner(verbosity=2).run(suite)
0
alanb 20 wrzesień 2012, 05:10

Rozwiązałem ten problem, zastępując FTS z pełną ścieżką I.E. / Home / Simon / Web2py / Applications / Testapp / FTS

Mam nadzieję że to pomoże

2
PrestonDocks 9 październik 2012, 12:02