用 Django 和PyVows 做异步测试
用Django和PyVows做异步测试,PyVows是流行的行为驱动开发(BDD)后端框架Vows中的一个端口。在这篇文章中,我将重点介绍如何使用PyVows和selenium对Django做GUI测试,并在本系列的下一篇文章中,我将讨论使用PyVows做单元测试。
在我们开始之前,花一分钟阅读这篇描述行为驱动和测试驱动的开发之间的差异的文章。
基本设置
让我们通过一组的例子来了解一下。启动一个新的Django项目(使用virtualenvwrapper,Django-pyVows,selenium):
$mkvirtualenvTDD-Django--no-site-packages
$workonTDD-Django
$pipinstallpyVowsdjangodjango-pyVowsseleniumlxmlcssselect
$django-admin.pystartprojecttddapp
这个设置就是我们现在需要的。我们通过将uitests.py添加到tddapp来创建我们的第一个pyVowsGUI测试中加入,然后添加以下代码:
frompyvowsimportVows,expect
fromdjango_pyvows.contextimportDjangoHTTPContext
fromseleniumimportwebdriver
@Vows.batch
classTDDDjangoApp(DjangoHTTPContext):
defget_settings(self):
return"tddapp.settings"
deftopic(self):
self.start_server()
browser=webdriver.Firefox()
browser.get(self.get_url("/"))
returnbrowser
defshould_prompt_the_user_with_a_login_page(self,topic):
expect(topic.title).to_include('Django')
在这里到底发生了什么?
在测试开始用import调用所有必要的库,包括pyvows,Django的pyvows和selenium:
frompyvowsimportVows,expect
fromdjango_pyvows.contextimportDjangoHTTPContext
fromseleniumimportwebdriver
下一行会创建一个在pyVows中的测试组。在pyVows中的测试组由@Vows.batch装饰器识别,也就等同于单元测试。测试例在Python标准库的单元测试模块中。
测试组是来描述你想要测试的不同组件情况的contex,一般一组测试将继承的Vows。context在这里是从DjangoHTTPContext中作为类继承提供所有helper功能放入django_pyvows中。除了从DjangoHTTPContext继承,你还需要覆盖函数get_settings()并且返回你想要用来运行测试的settings.py文件的路径:
@Vows.batch
classTDDDjangoApp(DjangoHTTPContext):
defget_settings(self):
return"tddapp.settings"
每个context应该包含一个单一的topic,这个topic是你想要测试的对象和一些对topic进行测试的vows。我们用start_server()helper函数为我们的topic启动djangoserver,执行Selenium并指引Selenium到我们的django应用程序根部。然后,由于这是一个GUI测试,我们的topic返回Seleniumwebdriver,因此我们可以完成我们的测试。
Note:self.get_url("/")translatestherelativeurltotheabsoluteurlthatweneedtoaccessthesite.
接下来,我们第一次vow测试检查看看网页的标题是否包括'Django':
deftopic(self):
self.start_server()
browser=webdriver.Firefox()
browser.get(self.get_url("/"))
returnbrowser
defshould_prompt_the_user_with_a_django_page(self,topic):
expect(topic.title).to_include('Django')
在这里运行测试应该会通过,因为在Django默认页有一个"WelcometoDjango"标题。这将检测我们基本设置是否正确,然后我们可以开始写其它。运行测试的输出如下所示:
$pyVows-vvvuitests.py
============
VowsResults
============
Tdddjangoapp
✓shouldprompttheuserwithadjangopage
✓OK»1honored•0broken(2.489381s)
Andafailedtestwouldlooklikethis:
$pyVows-vvvuitests.py
============
VowsResults
============
Tdddjangoapp
✗shouldprompttheuserwithadjangopage
Expectedtopic(u'PageNotFound')toinclude'Login'
...snippingTracebacktosavespace...
✗OK»0honored•1broken(2.489381s)
注意报告中测试的命名。最外层的缩进线是context(TDDDjangoApp)的每个vow/test在这个context中倾斜和下方缩进的。这使得报告和发现缺陷的确容易,因为它读起来像是一套的需求。请思考下列报告:
$pyVows-vvvuitests.py
============
VowsResults
============
Tdddjangoapp
onChrome
✓shouldprompttheuserwithadjangopage
onFirefox
✗shouldprompttheuserwithadjangopage
...snippingTracebacktosavespace...
✗OK»1honored•1broken(3.119354s)
在上面虚构的例子中我们可以看到我们的设置为在Chrome中工作和但是在火狐浏览器中不工作。因此通过使用直观命名测试,pyVows生成了一份用来找出问题简单但高效的报告。
让我们并行运行一些东西
另外我们现在正在探讨在多个浏览器上的异步并行测试!让我们看看生成该报告的测试代码:
@Vows.batch
classTDDDjangoApp(DjangoContext):
classOnFirefox(DjangoHTTPContext):
defget_settings(self):
return"tddapp.settings"
deftopic(self):
self.start_server(port=8888)
browser=webdriver.Firefox()
browser.get(self.get_url("/"))
returnbrowser
defshould_prompt_the_user_with_a_django_page(self,topic):
expect(topic.title).to_include('stringnotinthetitle')
classOnChrome(DjangoHTTPContext):
defget_settings(self):
return"tddapp.settings"
deftopic(self):
self.start_server(port=8887)
browser=webdriver.Chrome()
browser.get(self.get_url("/"))
returnbrowser
defshould_prompt_the_user_with_a_django_page(self,topic):
expect(topic.title).to_include('Django')
Python培训、Python培训班、Python培训机构,就选光环大数据!
还不够过瘾?想学习更多?点击 http://hadoop.aura.cn/python/ 进行Python学习!
大数据培训、人工智能培训、Python培训、大数据培训机构、大数据培训班、数据分析培训、大数据可视化培训,就选光环大数据!光环大数据,聘请专业的大数据领域知名讲师,确保教学的整体质量与教学水准。讲师团及时掌握时代潮流技术,将前沿技能融入教学中,确保学生所学知识顺应时代所需。通过深入浅出、通俗易懂的教学方式,指导学生更快的掌握技能知识,成就上万个高薪就业学子。 更多问题咨询,欢迎点击------>>>>在线客服!