(A22)Tapestry Core:Unit testing pages or components

Tapestry5页面单元测试
本文介绍如何使用PageTester对Tapestry5中的页面和组件进行单元测试,包括页面渲染、行动链接测试、表单提交及使用mock对象进行服务层测试的方法。
本人翻译目的是用来学习Tapestry5的,共享出来希望大家批评指正。计划持续翻译。
chinajavawolf  
页面或组件的单元测试
你可以非常容易的对某一页面或组件进行单元测试。跟随下面简单的工作:
  • 设置一个操作环境
为了测试页面,你需要创建一个PageTester.实例。它担当浏览器和servlet容器以使你可以使用它驾驭你的页面。事实上它不是一个真正的servlet容器,你需要告诉它你定义在web.xml中的同样信息:
  1. 你的应用包
  2. 你的过滤器名。这仅被用来装载你的Tapestry IoC模块。如果你没有,你可以传递一个空字符串或任何东西给它。
  3. 担当你上下文根目录的文件夹。这被用来定位你的模版(如果它们放在那里)。
这是一个例子(使用TestNG,但你也可以使用JUnit或其他的):
  1. public class MyTest extends Assert   
  2. {   
  3.     @Test  
  4.     public void test1()   
  5.     {   
  6.         String appPackage = "org.example.app";   
  7.         String appName = "App1"// App1Module.java has configured some services.   
  8.         PageTester tester = new PageTester(appPackage, appName, "src/main/webapp");   
  9.     }   
  10. }   
  • 测试呈现页
要测试页面是否完全呈现,你可以告诉PageTester去呈现它,然后对返回的DOM文档(DOM Document)进行断言。
这是个例子。让我们假定被测试页名为”MyPage”并且它应该返回一个包含id为”id1”的HTML元素的页面并且它的文本内容应该是”hello”
  1. public class MyTest extends Assert   
  2. {   
  3.     @Test  
  4.     public void test1()   
  5.     {   
  6.         String appPackage = "org.example.app";   
  7.         String appName = "LocaleApp";   
  8.         PageTester tester = new PageTester(appPackage, appName, "src/main/webapp");   
  9.         Document doc = tester.renderPage("MyPage");   
  10.         assertEquals(doc.getElementById("id1").getChildText(), "hello");   
  11.     }   
  12. }   
如果页面需要一个文本,你可以通过这种方法传递:
  1. public class MyTest extends Assert   
  2. {   
  3.     @Test  
  4.     public void test1()   
  5.     {   
  6.         String appPackage = "org.example.app";   
  7.         String appName = "LocaleApp";   
  8.         PageTester tester = new PageTester(appPackage, appName, "src/main/webapp");   
  9.         Object[] context = new Object[]{ "abc"123 };   
  10.         Document doc = tester.invoke(new ComponentInvocation(new PageLinkTarget("MyPage"), context));   
  11.         assertEquals(doc.getElementById("id1").getChildText(), "hello");   
  12.     }   
  13. }   
  •   测试一个action 链接
页面呈现后,你应该想要”点击”一个action链接,然后对结果页断言。你可以这样做:
  1. public class MyTest extends Assert   
  2. {   
  3.     @Test  
  4.     public void test1()   
  5.     {   
  6.         String appPackage = "org.example.app";   
  7.         String appName = "LocaleApp";   
  8.         PageTester tester = new PageTester(appPackage, appName, "src/main/webapp");   
  9.         Document doc = tester.renderPage("MyPage");   
  10.         Element link = doc.getElementById("link1");   
  11.         doc = tester.clickLink(link);   
  12.         assertTrue(doc.toString().contains("abc"));   
  13.     }   
  14. }   
  •   测试表单提交
页面呈现后,你应该想要填充表单,提交它然后检查结果页。你可以这样做:
  1. public class MyTest extends Assert   
  2. {   
  3.     @Test  
  4.     public void test1()   
  5.     {   
  6.         String appPackage = "org.example.app";   
  7.         String appName = "LocaleApp";   
  8.         PageTester tester = new PageTester(appPackage, appName, "src/main/webapp");   
  9.         Document doc = tester.renderPage("MyPage");   
  10.         Element form = doc.getElementById("form1");   
  11.         Map fieldValues = new HashMap();   
  12.         fieldValues.put("field1""hello");   
  13.         fieldValues.put("field2""100");   
  14.         doc = tester.submitForm(form, fieldValues);   
  15.         assertTrue(doc.toString().contains("abc"));   
  16.     }   
  17. }   
通过点击一个提交按钮提交表单,调用clickSubmit()方法。
  •   组件的单元测试
要对组件进行单元测试,仅需要创建一个包含这个组件的测试页面。然后测试这个页面就可以了。.
  • 提供mock 执行你的服务层
你的页面典型的是调用你的业务逻辑并且最终涉及到数据库。在单元测试时,尤其是测试你的UI(页面)时,强烈建议你不要调用它们。为了这样做,你应该放入你的事物控制代码,业务逻辑等到Tapestry IoC服务内。然后你应该使用mock 对象替换它们的执行。
  1. public class MyTest extends Assert   
  2. {   
  3.     @Test  
  4.     public void test1()   
  5.     {   
  6.         String appPackage = "org.example.app";   
  7.         String appName = "LocaleApp";   
  8.         Map serviceOverrides = new HashMap();   
  9.         Service1 service1Mock = new Service1() {   
  10.             public Object transform(Object input) {   
  11.                 //assert against the input and return some mock value   
  12.             }   
  13.         }   
  14.         Service2 service2Mock = new Service2() {   
  15.             public void perform(Object cmd) {   
  16.                 //assert against the cmd   
  17.             }   
  18.         }   
  19.         serviceOverrides.put("Service1", service1Mock);   
  20.         serviceOverrides.put("Service2", service2Mock);   
  21.         PageTester tester = new PageTester(appPackage, appName, "src/main/webapp", serviceOverrides);   
  22.     }   
  23. }   
 
【直流微电网】径向直流微电网的状态空间建模与线性化:一种耦合DC-DC变换器状态空间平均模型的方法 (Matlab代码实现)内容概要:本文介绍了径向直流微电网的状态空间建模与线性化方法,重点提出了一种基于耦合DC-DC变换器状态空间平均模型的建模策略。该方法通过对系统中多个相互耦合的DC-DC变换器进行统一建模,构建出整个微电网的集中状态空间模型,并在此基础上实施线性化处理,便于后续的小信号分析与稳定性研究。文中详细阐述了建模过程中的关键步骤,包括电路拓扑分析、状态变量选取、平均化处理以及雅可比矩阵的推导,最终通过Matlab代码实现模型仿真验证,展示了该方法在动态响应分析和控制器设计中的有效性。; 适合人群:具备电力电子、自动控制理论基础,熟悉Matlab/Simulink仿真工具,从事微电网、新能源系统建模与控制研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①掌握直流微电网中多变换器系统的统一建模方法;②理解状态空间平均法在非线性电力电子系统中的应用;③实现系统线性化并用于稳定性分析与控制器设计;④通过Matlab代码复现和扩展模型,服务于科研仿真与教学实践。; 阅读建议:建议读者结合Matlab代码逐步理解建模流程,重点关注状态变量的选择与平均化处理的数学推导,同时可尝试修改系统参数或拓扑结构以加深对模型通用性和适应性的理解。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值