当前位置: 首页 > news >正文

装饰网站建设网昆山网页网站制作

装饰网站建设网,昆山网页网站制作,西宁站 网站,wordpress登陆后台总是跳转首页在过去的十年中#xff0c;我们已经编写了成千上万的JUnit3测试#xff0c;现在正尝试将结果合并到数据库中#xff0c;而不是分散的日志文件中。 事实证明#xff0c;扩展TestCase类非常容易做到这一点。 注意#xff1a;这种方法并不直接适用于JUnit4或其他测试框架我们已经编写了成千上万的JUnit3测试现在正尝试将结果合并到数据库中而不是分散的日志文件中。 事实证明扩展TestCase类非常容易做到这一点。 注意这种方法并不直接适用于JUnit4或其他测试框架但是通常可以做类似的事情。 被测类及其测验 出于演示目的我们可以使用单个方法来定义一个类进行测试。 public class MyTestedClass {public String op(String a, String b) {return ((a null) ? : a) : ((b null) ? : b);} } 具有单个要测试方法的类比您想象的要少的限制。 在前面提到的数千个测试中我们仅测试了四种方法。 这是上述类的一些测试。 public class MySimpleTest extends SimpleTestCase {private MyTestedClass obj new MyTestedClass();public void test1() {assertEquals(a:b, obj.op(a, b));}public void test2() {assertEquals(:b, obj.op(null, b));}public void test3() {assertEquals(a:, obj.op(a, null));}public void test4() {assertEquals(:, obj.op(null, null));}public void test5() {// this will failassertEquals( : , obj.op(null, null));} }使用TestListener捕获基本信息 JUnit3允许向侦听器添加其测试过程。 在测试运行之前和之后以及测试失败或有错误引发异常的任何时间调用此侦听器。 此TestListener将基本测试信息写入System.out以作为概念证明。 修改它以将信息写入数据库JMS主题等很容易。 public class SimpleTestListener implements TestListener {private static final TimeZone UTC TimeZone.getTimeZone(UTC);private long start;private boolean successful true;private String name;private String failure null;SimpleTestListener() {}public void setName(String name) {this.name name;}public void startTest(Test test) {start System.currentTimeMillis();}public void addError(Test test, Throwable t) {// cache information about error.successful false;}public void addFailure(Test test, AssertionFailedError e) {// cache information about failure.failure e.getMessage();successful false;}/*** After the test finishes we can update the database with statistics about* the test - name, elapsed time, whether it was successful, etc.*/public void endTest(Test test) {long elapsed System.currentTimeMillis() - start;SimpleDateFormat fmt new SimpleDateFormat();fmt.setTimeZone(UTC);System.out.printf([%s, %s, %s, %d, %s, %s]\n, test.getClass().getName(), name, fmt.format(new Date(start)),elapsed, failure, Boolean.toString(successful));// write any information about errors or failures to database.} } 生产TestListener应该在错误和失败方面做更多的事情。 我将其忽略以便专注于更广泛的问题。 该侦听器不是线程安全的因此我们将要使用Factory模式为每个测试创建一个新实例。 我们可以在工厂中创建重量级对象例如在工厂中打开SQL DataSource并将新的Connection传递给每个实例。 public class SimpleTestListenerFactory {public static final SimpleTestListenerFactory INSTANCE new SimpleTestListenerFactory();public SimpleTestListenerFactory() {// establish connection data source here?}public SimpleTestListener newInstance() {// initialize listener.SimpleTestListener listener new SimpleTestListener();return listener;} } 如果我们知道测试框架是纯串行的我们可以通过创建缓冲区并在startTest中调用System.setOut然后在endTest中还原原始System.out来捕获所有控制台输出。 只要测试永不重叠此方法就行得通否则会引起问题。 但是这可能会出现问题– IDE可能具有自己的允许并行执行的测试运行程序。 我们用自己的方法覆盖标准的run方法该方法在调用现有的run方法之前创建并注册一个侦听器。 public class SimpleTestCase extends TestCase {public void run(TestResult result) {SimpleTestListener l SimpleTestListenerFactory.INSTANCE.newInstance();result.addListener(l);l.setName(getName());super.run(result);result.removeListener(l);}} 现在我们将预期的结果发送到System.out。 [MySimpleTest, test1, 8/2/15 11:58 PM, 0, null, true] [MySimpleTest, test2, 8/2/15 11:58 PM, 10, null, true] [MySimpleTest, test3, 8/2/15 11:58 PM, 0, null, true] [MySimpleTest, test4, 8/2/15 11:58 PM, 0, null, true] [MySimpleTest, test5, 8/2/15 11:58 PM, 4, expected same:: was not: : , false]使用外观和TestListener捕获呼叫信息 这是一个好的开始但我们可能会做得更好。 在上面提到的数千个测试中仅调用了4种方法-如果我们能够捕获这些调用的输入和输出值则将非常强大。 如果由于某些原因不可接受AOP则可以使用AOP或日志记录外观包装这些功能。 在简单的情况下我们可以简单地捕获输入和输出值。 public class MyFacadeClass extends MyTestedClass {private MyTestedClass parent;private String a;private String b;private String result;public MyFacadeClass(MyTestedClass parent) {this.parent parent;}public String getA() {return a;}public String getB() {return b;}public String getResult() {return result;}/*** Wrap tested method so we can capture input and output.*/public String op(String a, String b) {this.a a;this.b b;String result parent.op(a, b);this.result result;return result;}} 我们像以前一样记录基本信息并添加一些新代码来记录输入和输出。 public class AdvancedTestListener extends SimpleTestListener {AdvancedTestListener() {}/*** Log information as before but also log call details.*/public void endTest(Test test) {super.endTest(test);// add captured inputs and outputsif (test instanceof MyAdvancedTest) {MyTestedClass obj ((MyAdvancedTest) test).obj;if (obj instanceof MyFacadeClass) {MyFacadeClass facade (MyFacadeClass) obj;System.out.printf([, , %s, %s, %s]\n, facade.getA(), facade.getB(), facade.getResult());}}} } 日志现在显示基本信息和呼叫详细信息。 [MyAdvancedTest, test2, 8/3/15 12:13 AM, 33, null, true] [, , null, b, :b] [MyAdvancedTest, test3, 8/3/15 12:13 AM, 0, null, true] [, , a, null, a:] [MyAdvancedTest, test4, 8/3/15 12:13 AM, 0, null, true] [, , null, null, :] [MyAdvancedTest, test1, 8/3/15 12:13 AM, 0, null, true] [, , a, b, a:b] 我们希望将基本详细信息和呼叫详细信息相关联但是通过添加唯一的测试ID可以轻松实现。 在现实世界中这种方法还不够在单个测试中被测方法可能被多次调用。 在这种情况下我们要么需要一种方法来缓存多组输入和输出值要么需要扩展侦听器以便我们可以在每个涵盖方法的末尾调用它。 通过将结果编码为XML或JSON而不是简单的列表可以使结果更具扩展性。 这将使我们仅捕获感兴趣的值或轻松处理将来添加的字段。 [MyAdvancedTest, test2, 8/3/15 12:13 AM, 33, null, true] {a:null, b:b, results::b } [MyAdvancedTest, test3, 8/3/15 12:13 AM, 0, null, true] {a:a, b:null, results:a: } [MyAdvancedTest, test4, 8/3/15 12:13 AM, 0, null, true] {a:null, b:null, results:: } [MyAdvancedTest, test1, 8/3/15 12:13 AM, 0, null, true] {a: a, b:b, results: a:b }捕获 现在我们可以通过重放捕获的输入来重新运行测试但是盲目比较结果存在两个问题。 首先如果我们只关心单个值这将是很多不必要的工作。 其次许多测试是不确定的例如它们使用随时间变化的固定数据甚至实时数据而我们不关心的事情可能会改变。 这不是一个容易的问题。 如果幸运的话测试将遵循标准模式我们可以对正在执行的测试做出很好的猜测但需要手动进行验证。 首先我们需要使用捕获某些或所有方法调用的外观包装测试方法的结果。 调用历史记录应该以一种我们以后可以重播的形式提供例如一系列方法名称和序列化参数。 其次我们需要包装TestCase assertX方法以便捕获最近的方法调用以及传递给assert调用的值当然还有结果。 例 通过示例最容易展示和删除该过程。 让我们从一个简单的POJO开始。 public class Person {private String firstName;private String lastName;public String getFirstName() { return firstName; }public String getLastName() { return lastName; } } 在这种情况下我们的外观仅需要记录方法名称。 典型的测试方法是 public void test1() {Person p getTestPerson();assertEquals(John, p.getFirstName());assertEquals(Smith, p.getLastName()); } 使用包装的assertX方法 static PersonFacade person;public static void assertEquals(String expected, String actual) {// ignoring null handling...boolean results expected.equals(actual);LOG.log(assertEquals( expected ,person.getMethodsCalled() ) results);person.clearMethodsCalled();if (!results) {throw new AssertionFailedError(Expected same: expected was not: actual );} } 所以我们会得到像 assertEquals(John, getFirstName()) true; assertEquals(Smith, getLastName()) false; 不难看出如何通过测试框架来解析它但是现在还为时过早。 第二种测试方法是 public void test1() {Person p getTestPerson();assertEquals(john, p.getFirstName().toLowerCase()); } 并且我们的简单代码不会捕获toLowerCase 。 我们的日志将错误记录 assertEquals(John, getFirstName()) false; 更为病理的情况是 public void test1() {Person p getTestPerson();LOG.log(testing p.getFirstName());assertEquals(john, joe); } 断言与包装的类无关。 有明显的创可贴例如我们可以捕获外观中的返回值但这是一个非常深的兔子洞我们希望远离它。 我认为答案是做出合理的第一次尝试手动验证结果然后再做。 可选将测试重写为可以捕获的形式。 翻译自: https://www.javacodegeeks.com/2015/08/adding-database-logging-to-junit3.html
http://www.pierceye.com/news/257826/

相关文章:

  • 网站系统建设技术服务费网站建设 专项资金变更
  • 网站建设画册怎么用eclipse做网页
  • 百度网站安全检测平台广州番禺营销型网站建设
  • 杭州大的做网站的公司甘肃省住房和城乡建设部网站首页
  • 网站建设与网页设计考试题棋牌软件开发搭建
  • 短链接生成网址wordpress主叶SEO优化
  • 免费的cms视频网站做cpa怎么建立自己网站
  • 在哪里找做网站的北京的招聘网站有哪些
  • 做旅行网站aspx网站开发
  • 网站接入服务器商查询wordpress更换端口
  • 网站网页设计师武义县网站建设
  • 中铁建设集团有限公司官网建站到网站收录到优化
  • 做seo网站要多少钱网页设计师好吗
  • 建设部网站 绿色建筑评价表哪里页面设计培训好
  • 西部数码网站源码虹桥做网站公司
  • 生鲜网站开发wordpress mysql 链接
  • 做网站是怎么挣钱的网站建设福永附近网络公司
  • 关于网站制作的评价.net网站制作综合实训报告
  • 合肥专业制作网站科技创新绘画作品图片
  • 站内推广的主要目的是商业空间设计心得体会
  • 网站建设丨金手指15phpcms建设网站
  • 怎么网上推广自己的产品郑州seo优化外包顾问阿亮
  • 灵台门户网站建设网站开发费用会计分录
  • wordpress替换公共js北京seo推广服务
  • 公司付的网站费怎么做分录黑色网站配色
  • 体育门户网站源码峰峰做网站
  • 山西网站建设多少钱电商网站建设需要
  • 海西电子商务网站建设wordpress 主题宽度
  • 网站建设首选公司wordpress需要mysql
  • 织梦 旅游网站模板深圳公司招牌制作