play手把手教你创建一个博客项目10完整的应用程序测试
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
play手把手教你创建一个博客项目10完整的应用程
序测试
现在,我们差不多终止了博客引擎的编码工作,但对项目来讲还没有完成,为了让我们的代码能够完全正确的工作,我们还需要对项目进行测试。
因此,我们之前差不多为yabe的模型层功能书写的单元测试,同时确信博客引擎的核心功能差不多进行了完好的测试,然而关于一个web应用程序来讲模型层只是其中的一部分,我们还需要确定web接口能否按预期的目标一样正常工作。也确实是讲还需要测试yabe博客引擎的操纵器层,甚至需要对UI自身进行测试,比如我们的JavaScript代码。
测试操纵器部分
Play提供了一种功能,确实是使用JUnit来直截了当测试应用程序的操纵器。我们把这些测试叫做‘功能性测试’,这是因为我们打算测试web应用程序的完整功能。
差不多上,一个功能性测试将直截了当调用Play的ActionInvoker,和一个HTTP 要求相似。因此我们需要给出一个HTTP方法、一个URI和多个HTTP参数。 Play 之后会路由这些要求,调用相应的action,同时回发到填写的响应(filled response)。之后,你就能够对之进行分析,以检查响应内容是否你所预期的。
import org.junit.*;
import play.test.*;
import play.mvc.*;
import play.mvc.Http.*;
import models.*;
public class ApplicationTest extends FunctionalTest {
@Test
public void testThatIndexPageWorks() {
Response response = GET("/");
assertIsOk(response);
assertContentType("text/html", response);
assertCharset("utf-8", response);
}
}
现在看,它依旧一个标准的JUnit测试。请注意,在那个地点我们使用Play的FunctionalTest超类,要紧是为了得到所有可用的工具。那个测试只对应用程序的主页进行了测试(/ URL渲染一个HTML响应,以‘200 OK’作为状态代码)。
接下来,我们将检查治理区域(administration area)的安全工作能否正常工作。在ApplicationTest.java里添加下面那个新测试:
…
@Test
public void testAdminSecurity() {
Response response = GET("/admin");
assertStatus(302, response);
assertHeaderEquals("Location", "/login", response);
}
…
现在,用play test命令把yabe应用程序运行于测试模式,打开, 选择ApplicationTest.java测试并运行。
是绿色的吗?
因此!通过这种方式,我们能够对所有的应用程序功能性进行测试,但把这用于测试一个基于html的web应用程序时,这并不是最好的方式。关于我们的博客引擎项目来讲,直截了当在真实的扫瞄器进行测试可能会更好。这确实是play 的‘Selenium tests’测试要干的事。
这种基于“功能性测试”的JUnit仍旧专门有用,专门是用于测试一个返回非html响应(比如JSON或XML)的Web services时。
书写Selenium测试代码
Selenium是一个专用于测试web应用程序的测试工具。那个工具最酷的确实是Selenium承诺我们在一个扫瞄器里直截了当运行测试套件,由于它使用的是真实的扫瞄器,因此,我们能够确定测试通过后,项目就能够在生产环境下完美的运行。
一个Selenium测试套件确实是一个专门的html文件。HTML syntax required by Selenium必须使用的HTML语句比较单调(使用HTML表格元素进行数据格式化显示),好消息是play将使用play模板引擎和一系列支持简单Selenium表示语法的标签来关心你生成这些元素)。使用模板最有味的特点是你全然不需要
‘static scenarios’,同时能够使用play模板强大的功能(如循环、条件块)来书写更复杂的测试。
然而,你仍旧能够连续在模板里使用原始的HTML Selenium语法,假如需要的话,还能够不记得特定的Selenium标签。假如你使用多个用于生成test
scenarios(比如Selenium IDE)的Selenium工具中的一个,这将变得专门有味。
新创建的play应用程序的默认测试套件差不多包含了一个Selenium测试,打开yabe/test/Application.test.html文件:
*{ You can use plain Selenium commands using the selenium tag }*
#{selenium}
// Open the home page, and check that no error occurred
open('/')
waitForPageToLoad(1000)
assertNotTitle('Application error')
#{/selenium}
运行那个测试应该可不能有任何咨询题。它只打开了主页,并检测页面内容是否包含了‘Application error’文本。
然而,和任何复杂的测试一样,在导航到应用程序并进行测试之前,你需要设置一系列众所周知的数据,我们因此需要重用fixture概念,同时在开始测试之前使用yabe/test/data.yml文件,#{fixture /}标签导入这些测试数据:
#{fixture delete:'all', load:'data.yml' /}
#{selenium}
// Open the home page, and check that no error occurred
open('/')
waitForPageToLoad(1000)
assertNotTitle('Application error')
#{/selenium}