2016-11-26 2 views
1

Pourquoi mon script de test me donne-t-il cette erreur? Voici mon code:L'objet 'module' n'a pas d'attribut 'test un'

# fill_web_form_test.py 

# import statements 
import unittest 
import fill_web_form 
import sqlite3 
import sys 

form = 'test' 
form_name = 'test_form' 

if(len(sys.argv) < 2): 
     raise RuntimeError('invalid number of arguments, please enter at least one arguement to be \ 
         test fill_web_form.py') 
for arg in sys.argv: 
    if(not isinstance(arg, str)): 
     raise RuntimeError('All arguments must be strings') 
# these test strings will be entered by the user as the first parameter 
# it will be submited to the webpage to test fill_web_form.py 
data = sys.argv[1:len(sys.argv)] 
print "data = " + ', '.join(data) 

class KnownValues(unittest.TestCase): 

    def test_fill_form(self): 

     # connect to sample database 
     print 'connecting to database' 
     conn = sqlite3.connect('FlaskApp\FlaskApp\sample.db') 
     conn.text_factory = str 

     # clear database table 
     print "clearing database" 
     cursor = conn.cursor() 
     cursor.execute("DROP TABLE if exists test_table") 
     cursor.execute("CREATE TABLE if not exists test_table(test_column)") 
     conn.commit() 

     # run function 
     print "running fill_web_form.py" 
     for data_entry in data: 
      fill_web_form.fill_form("http://127.0.0.1:5000", form, form_name, data_entry) 

     # get results of function from database 
     print "fetching results of fill_web_form.py" 
     cursor = conn.execute("SELECT * FROM test_table") 
     result = cursor.fetchall()[0] 
     print "Database contains strings: " + result 
     expected = data 

     # check for expected output 
     print "checking if output is correct" 
     self.assertEquals(expected, result) 

# Run tests 

if __name__ == '__main__': 
    unittest.main() 

Voici le code pour fill_web_form.py, le script qu'il teste

# fill_web_form.py 
import mechanize 


def fill_form(url, form, form_name, data): 
     print "opening browser" 
     br = mechanize.Browser() 
     print "opening url...please wait" 
     br.open(url) 
     print br.title() 
     print "selecting form" 
     br.select_form(name=form) 
     print "entering string:'" + data +"' into form" 
     br[form_name] = data 
     print "submitting form" 
     br.submit() 

Quand je lance python fill_web_form_test.py "testone" "testtwo" "testthree" dans cmd je reçois cette erreur: enter image description here

Mon script de test est censé prendre un nombre quelconque de chaînes et envoyer à fill_web_form.py qui les postera à un formulaire Web que j'ai sur mon système au 127.0.0.1

Mais je garde gettin cette erreur AttributeError: module has no attribute 'testone' Je ne comprenais pas, je ne cherche pas à accéder à un module avec un attribut « testone, je voulais juste passer cette chaîne à fill_web_form.py

Quelqu'un peut-il me aider ?

+0

Quelle ligne est la ligne 58 dans votre code ci-dessus? – ettanany

+0

@ettanany C'est la toute dernière ligne du premier script 'unittest.main()' –

Répondre

1

N'oubliez pas que unittest.main accepte les arguments de ligne de commande. Essayez:

>fill_web_form_test.py -h 
Usage: fill_web_form_test.py [options] [test] [...] 

Options: 
    -h, --help  Show this message 
    -v, --verbose Verbose output 
    -q, --quiet  Minimal output 
    -f, --failfast Stop on first failure 
    -c, --catch  Catch control-C and display results 
    -b, --buffer  Buffer stdout and stderr during test runs 

Examples: 
    fill_web_form_test.py        - run default set of tests 
    fill_web_form_test.py MyTestSuite     - run suite 'MyTestSuite' 
    fill_web_form_test.py MyTestCase.testSomething  - run MyTestCase.testSomething 
    fill_web_form_test.py MyTestCase     - run all 'test*' test methods 
                 in MyTestCase 

Ainsi, votre ligne de commande params "testone" "testtwo" "testthree" sont également intepreted par unittest.main comme les noms des cas de test non existants dans fill_web_form_test.py

Pour surmonter ce problème, spécifiez argv comme ceci:

if __name__ == '__main__': 
    unittest.main(argv=sys.argv[:1])