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

专门做恐怖电影的网站开发商逾期交房怎么赔偿

专门做恐怖电影的网站,开发商逾期交房怎么赔偿,广州哪里学网络营销比较好,网站建设合伙人这是一些技巧#xff0c;说明如何进行代码的逻辑正确性测试#xff08;与多线程正确性相对#xff09;。 我发现本质上有两种带有线程代码的刻板印象模式#xff1a; 面向任务–许多短期运行的同类任务#xff0c;通常在Java 5执行程序框架内运行#xff0c; 面向流程–… 这是一些技巧说明如何进行代码的逻辑正确性测试与多线程正确性相对。 我发现本质上有两种带有线程代码的刻板印象模式 面向任务–许多短期运行的同类任务通常在Java 5执行程序框架内运行 面向流程–很少长时间运行的异构任务通常基于事件等待通知或轮询周期之间休眠通常使用线程或可运行的方式表示。 测试这两种类型的代码可能很难。 该工作是在另一个线程中完成的因此完成通知可能是不透明的或者隐藏在抽象级别的后面。 该代码在GitHub上 。 提示1 –生命周期管理对象 具有生命周期受管理的对象更易于测试该生命周期允许设置和拆卸这意味着您可以在测试后进行清理而没有乱码干扰任何其他测试。 public class Foo {private ExecutorService executorService;public void start() {executorService Executors.newSingleThreadExecutor();}public void stop() {executorService.shutdown();} } 技巧2 –设置测试超时 代码中的错误如下所示可能导致多线程测试永远不会完成例如例如您正在等待从未设置的标志。 JUnit允许您设置测试超时。 ... Test(timeout 100) // in case we never get a notification public void testGivenNewFooWhenIncrThenGetOne() throws Exception { ... 技巧3 –在与测试相同的线程中运行任务 通常您将拥有一个在线程池中运行任务的对象。 这意味着您的单元测试可能必须等待任务完成但是您不知道什么时候完成。 您可能会猜测例如 public class Foo {private final AtomicLong foo new AtomicLong(); ...public void incr() {executorService.submit(new Runnable() {Overridepublic void run() {foo.incrementAndGet();}});} ...public long get() {return foo.get();} }public class FooTest {private Foo sut; // system under testBeforepublic void setUp() throws Exception {sut new Foo();sut.start();}Afterpublic void tearDown() throws Exception {sut.stop();}Testpublic void testGivenFooWhenIncrementGetOne() throws Exception {sut.incr();Thread.sleep(1000); // yuk - a slow test - dont do thisassertEquals(foo, 1, sut.get());} } 但这是有问题的。 执行是不统一的因此不能保证它可以在另一台机器上运行。 它很脆弱对代码的更改可能会导致测试失败因为它突然花费了太长时间。 它的速度很慢因为当它失败时您会大方入睡。 一个诀窍是使任务同步运行即与测试在同一线程中运行。 这可以通过注入执行程序来实现 public class Foo { ...public Foo(ExecutorService executorService) {this.executorService executorService;} ...public void stop() {// nop } 然后您可以使用同步执行程序服务概念类似于SynchronousQueue进行测试 public class SynchronousExecutorService extends AbstractExecutorService {private boolean shutdown;Overridepublic void shutdown() {shutdown true;}Overridepublic ListRunnable shutdownNow() {shutdown true; return Collections.emptyList();}Overridepublic boolean isShutdown() {shutdown true; return shutdown;}Overridepublic boolean isTerminated() {return shutdown;}Overridepublic boolean awaitTermination(final long timeout, final TimeUnit unit) {return true;}Overridepublic void execute(final Runnable command) {command.run();} } 不需要睡觉的更新测试 public class FooTest {private Foo sut; // system under testprivate ExecutorService executorService;Beforepublic void setUp() throws Exception {executorService new SynchronousExecutorService();sut new Foo(executorService);sut.start();}Afterpublic void tearDown() throws Exception {sut.stop();executorService.shutdown();}Testpublic void testGivenFooWhenIncrementGetOne() throws Exception {sut.incr();assertEquals(foo, 1, sut.get());} } 请注意您需要从外部对Foo的执行程序进行生命周期管理。 技巧4 –从线程中提取工作 如果您的线程正在等待一个事件或者正在等待某个时间则将其提取到自己的方法中并直接调用它。 考虑一下 public class FooThread extends Thread {private final Object ready new Object();private volatile boolean cancelled;private final AtomicLong foo new AtomicLong();Overridepublic void run() {try {synchronized (ready) {while (!cancelled) {ready.wait();foo.incrementAndGet();}}} catch (InterruptedException e) {e.printStackTrace(); // bad practise generally, but good enough for this example}}public void incr() {synchronized (ready) {ready.notifyAll();}}public long get() {return foo.get();}public void cancel() throws InterruptedException {cancelled true;synchronized (ready) {ready.notifyAll();}} } 而这个测试 public class FooThreadTest {private FooThread sut;Beforepublic void setUp() throws Exception {sut new FooThread();sut.start();Thread.sleep(1000); // yukassertEquals(thread state, Thread.State.WAITING, sut.getState());}Afterpublic void tearDown() throws Exception {sut.cancel();}Afterpublic void tearDown() throws Exception {sut.cancel();}Testpublic void testGivenNewFooWhenIncrThenGetOne() throws Exception {sut.incr();Thread.sleep(1000); // yukassertEquals(foo, 1, sut.get());} } 现在提取工作 Overridepublic void run() {try {synchronized (ready) {while (!cancelled) {ready.wait();undertakeWork();}}} catch (InterruptedException e) {e.printStackTrace(); // bad practise generally, but good enough for this example}}void undertakeWork() {foo.incrementAndGet();} 重构测试 public class FooThreadTest {private FooThread sut;Beforepublic void setUp() throws Exception {sut new FooThread();}Testpublic void testGivenNewFooWhenIncrThenGetOne() throws Exception {sut.incr();sut.undertakeWork();assertEquals(foo, 1, sut.get());} } 提示5 –通过事件通知状态更改 前面两个技巧的替代方法是使用通知系统以便您的测试可以侦听线程对象。 这是一个面向任务的示例 public class ObservableFoo extends Observable {private final AtomicLong foo new AtomicLong();private ExecutorService executorService;public void start() {executorService Executors.newSingleThreadExecutor();}public void stop() {executorService.shutdown();}public void incr() {executorService.submit(new Runnable() {Overridepublic void run() {foo.incrementAndGet();setChanged();notifyObservers(); // lazy use of observable}});}public long get() {return foo.get();} } 及其对应的测试注意使用超时 public class ObservableFooTest implements Observer {private ObservableFoo sut;private CountDownLatch updateLatch; // used to react to eventBeforepublic void setUp() throws Exception {updateLatch new CountDownLatch(1);sut new ObservableFoo();sut.addObserver(this);sut.start();}Overridepublic void update(final Observable o, final Object arg) {assert o sut;updateLatch.countDown();}Afterpublic void tearDown() throws Exception {sut.deleteObserver(this);sut.stop();}Test(timeout 100) // in case we never get a notificationpublic void testGivenNewFooWhenIncrThenGetOne() throws Exception {sut.incr();updateLatch.await();assertEquals(foo, 1, sut.get());} } 这有优点和缺点 优点 创建用于侦听对象的有用代码。 可以利用现有的通知代码这使其成为已经存在的一个不错的选择。 更加灵活可以同时应用于任务和面向过程的代码。 它比提取工作更具凝聚力。 缺点 侦听器代码可能很复杂并且会带来自己的问题从而创建了应测试的其他生产代码。 将提交与通知分离。 要求您处理没有发送通知的情况例如由于错误。 测试代码可能很冗长因此容易出错。 参考 Alex Collins博客博客中来自JCG合作伙伴 Alex Collins的5条关于单元测试线程代码的技巧 。 翻译自: https://www.javacodegeeks.com/2012/09/5-tips-for-unit-testing-threaded-code.html
http://www.sadfv.cn/news/221612/

相关文章:

  • 做相关性分析的网站php网站优化
  • 淳安县千岛湖建设集团网站在阿里巴巴做网站
  • 电脑做网站成都附近旅游景区哪里好玩
  • 网站开发 网页设计wordpress手机电影
  • seo 网站结构优化网站开发经典案例
  • 北京市建设监理协会网站常州知名做网站服务
  • 怎么做网站淘宝转换工具如何线上营销
  • 鞍山市网站建设自己建设房源网站
  • 深圳福永做网站体育直播网站制作开发
  • 百度云建网站微信电脑网页版
  • 电子商务网站设计物流方案广西网站建设教程
  • 中国建设银行网站主要功能网站建设咨询有客诚信网站建设咨询
  • 什么网站可以接单做专门做鞋子的网站
  • 带后台的网站模板网站版式布局
  • 西安城市建设职业学院官方网站广开网络教学平台
  • 四川网站建设外包app网站建设哪家好
  • 中文网站常用字体潍坊网站建设兼职
  • 网站瀑布流怎么做重庆公司章程如何查询下载
  • 微软网站开发技术重庆市建筑协会信息网
  • 更合网站设计制作阿里大数据平台
  • 海宁网站开发我国的课程一般通过
  • 深圳市手机网站建设怎么样管理系统的组成
  • 网站毕业设计一般做几个页面合肥聚名网络科技有限公司
  • 品牌授权网站怎么设置网站的关键字
  • 济南制作网站企业写给初学网站开发们的一封信
  • 哪些网站微信支付平台通过php获取手机网站访客的手机号码
  • 数据分析网站网站服务器权限
  • 手机网站 微信网站企业做网站分哪几种
  • 做积分商城网站seo教程网站优化
  • 自己建网站怎么做影视资源wordpress 搜索 分词