我想问一下在Web开发中使用单元测试.单元测试的想法很棒,但是它确实在Web应用程序的上下文中带来了价值吗?我的问题的第二部分是关于TDD.如果在实际代码之前创建集成测试,这种方法可以称为"测试驱动开发"吗?
1.假设
根据定义,单元测试应该只在一个服务层上测试代码.如果测试跨多个层测试代码,我们就会进行集成测试.
2.争论
2.1无算法
Web应用程序中的算法不多.这不像是建立一个3D物理引擎,每个方法都会遇到挑战并且很难调试.Web应用程序主要是关于集成和生成HTML.
Web应用程序面临的最大挑战是: - 干净的代码(任何软件的通用问题,但不可测试) - 数据一致性 - 集成(编程语言,文件系统,配置文件,Web服务器,缓存系统,数据库,搜索引擎,外部API - 所有这些系统必须按要求一起工作)
如果要为Web应用程序中的每个类构建单元测试,您将测试(在大多数情况下):填充数组,字符串连接和语言的本机函数.
2.2成本
仅仅因为Web应用程序是关于集成的,所以总是有多个依赖项.你必须嘲笑许多不同的类,写一个小测试可能实际上是一个很大的工作.更糟糕的是,这不仅仅是关于测试.软件需要可测试.这意味着必须能够在几乎每个类中注入依赖项.在两个类(或系统)之间创建附加层并不总是可以注入依赖项.它使代码复杂化并使其使用起来更加昂贵.
3.集成测试
如果Web开发是关于集成的,那么为什么不测试呢?反驳论点很少.
3.1集成测试说"有些东西被打破",但没有说明在哪里
这真的归结为:与集成测试失败相比,制作代码"UnitTestable"所需的时间与更复杂(我猜这是主观的)相比,需要多长时间才能找到错误?根据我的经验,找到问题的根源从未花费很长时间.
3.2您可以在任何环境中运行单元测试,但很难进行集成测试
是的,如果您想在没有数据库的情况下运行集成测试.通常有一个数据库.只要你在每次测试后操作修复数据并清理,那么它应该没问题.事务数据库非常适合此任务.打开事务,插入数据,测试,回滚.
3.3集成测试很难维护
我无法对此发表评论,因为我的所有测试工作都很顺利,而且我从未遇到过这方面的问题.
4.创建良好的单元测试!
整个论点可以被攻击"如果你创建单元测试权利,那么你没有任何问题.".集成测试不能相同吗?如果更容易创建集成测试,为什么不坚持下去,只是做对了?
不要误会我的意思我不反对单元测试.这是完美的主意,我推荐给大家.我试图理解:它真的适合网络开发吗?我想听听你的意见和经验.
我想用Java和Cassandra 2.x(在Jersey框架上)构建一个RESTful API.我是这两种技术的新手,所以我想问你是集成和共享Cassandra驱动程序的正确方法.
0.通过Maven获取驱动程序
<dependency>
<groupId>com.datastax.cassandra</groupId>
<artifactId>cassandra-driver-core</artifactId>
<version>2.0.3</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)
1.使用Client类包装驱动程序的功能:
package com.example.cassandra;
import com.datastax.driver.core.*;
public class Client {
private Cluster cluster;
private Session session;
public Client(String node) {
connect( node );
}
private void connect(String node) {
cluster = Cluster.builder()
.addContactPoint(node)
.build();
session = cluster.connect();
}
public ResultSet execute( String cql3 ) {
return session.execute( cql3 );
}
public void close() {
cluster.close();
}
}
Run Code Online (Sandbox Code Playgroud)
2.我在ContextListener中启动客户端并通过上下文属性共享它
package com.example.listener;
import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import com.example.cassandra.Client;
public class ExampleContextListener implements …Run Code Online (Sandbox Code Playgroud) 设置PropelORM以处理多个数据库时,我几乎没有问题.我在文档中找不到任何有用的东西.
从多个数据库生成模式
我更喜欢先对数据库模式进行更改然后再运行
$ propel-gen . reverse
Run Code Online (Sandbox Code Playgroud)
获取schema.xml.如果我的系统包含多个数据库怎么办?它可以生成多个模式吗?我从文档中知道buildtime-conf.xml必须创建,但它对我没有任何作用.
生成类
假设我创建了不同的模式blog.schema.xml和platform.schema.xml.是否有可能:
每个模式都有不同的类前缀?在build.properties中我可以设置propel.classPrefix但是这将对每个模式全局工作.
每个架构都有不同的项目名称?再次在我可以设置的build.properties中propel.project,它将在classes目录中创建一个特定的目录.现在所有课程都会去同一个地方.如果我将在两个模式中使用相同的表名,则一个类将覆盖另一个类.
我可以自己解决的问题是为某个数据库设置2个不同的目录,但我更喜欢更优雅的解决方案.
我创建了一个驱动程序,它读取一个配置文件,构建一个对象列表(基于配置)并将该列表传递给MapReduce(MapReduce有一个静态属性,它保存对该对象列表的引用).
它只能在本地使用.一旦我在群集配置上运行作业,我将收到所有类型的错误,表明该列表尚未构建.这让我觉得我做错了,在群集设置上,MapReduce独立于驱动程序运行.
我的问题是如何正确初始化Mapper.
(我正在使用Hadoop 2.4.1)
我需要嗅探特定Linux用户(UID)的流量。我正在用iptables / NFLOG(http://wiki.wireshark.org/CaptureSetup/NFLOG)很好地工作。
我的问题是NFLOG将pcap封装更改为“ NFLOG”(从“以太网”),并且某些工具(如tcpflow)无法再读取它。
我的问题是:是否可以将这样的pcap转换为“旧式” pcap文件?
我拼命想让Gearman PHP扩展工作在Debian 6上.
我有所有的二进制文件和来源
root@debian:/tmp/pear/install# aptitude search gearman
i gearman - A distributed job queue
i A gearman-job-server - Job server for the Gearman
i gearman-tools - Tools for the Gearman
i libgearman-dev - Development files for the
i libgearman4 - Library providing Gearman
Run Code Online (Sandbox Code Playgroud)
...但是当PHP扩展程序中存在一些错误时,不允许我安装它
# /usr/local/pear/bin/pecl install gearman
downloading gearman-1.1.0.tgz ...
Starting to download gearman-1.1.0.tgz (30,488 bytes)
.........done: 30,488 bytes
3 source files, building
running: phpize
Configuring for:
PHP Api Version: 20090626
Zend Module Api No: 20090626
Zend Extension …Run Code Online (Sandbox Code Playgroud) 今天我遇到了一个非常恼人的问题.我的JavaScript停止工作过夜.当用户尝试在我的页面上创建FB操作时,会出现一个时髦的JS错误:
Uncaught TypeError: Cannot read property '__wrapped' of null
Run Code Online (Sandbox Code Playgroud)
发生错误connect.facebook.net/en_GB/all.js:82并且没有意义.在错误链中,从我的脚本调用的最后一行是FB.login(null, {scope: 'publish_actions'});.Facebook没有调用AJAX.JS SDK在到达任何地方之前就崩溃了.什么是更烦人的旧版本的我的脚本在不同的环境工作,所以我不能责怪Facebook.你知道我应该在哪里寻找问题吗?
一个多月以来,我一直在为一个非常烦人的内存泄漏问题而苦苦挣扎,但我不知道如何解决它。
我正在编写一个基于 http、async、cheerio 和 nano 的通用网络爬虫。从一开始我就一直在努力解决很难隔离的内存泄漏问题。我知道可以使用 Google Chrome 进行堆转储并对其进行分析,但我无法理解输出。它通常是一堆无意义的字符串和对象,导致一些匿名函数告诉我什么也没有(这可能是我缺乏经验)。
最终我得出一个结论,我当时使用的库(jQuery)有问题,我用 Cheerio 替换了它。我的印象是 Cheerio 解决了这个问题,但现在我确信它只会让它变得不那么戏剧化。
您可以在以下位置找到我的代码:https : //github.com/lukaszkujawa/node-web-crawler。我知道可能需要分析很多代码,但也许我正在做一些很愚蠢的事情,这可能是显而易见的。我怀疑来自多个“线程”的HTTP 请求https://github.com/lukaszkujawa/node-web-crawler/blob/master/webcrawler/agent.jsasync.queue)。
如果你想运行它需要 CouchDB 的代码,然后npm install执行以下操作:
$ node crawler.js -c conf.example.json
我知道 Node 不会对垃圾收集发疯,但是在 10 分钟的大量爬行后,使用的内存可以轻松超过 1GB。
(使用 v0.10.21 和 v0.10.22 测试)
我有一个示例代码:
@PUT
public String method(@FormParam("firstName") String firstName,
@FormParam("lastName") String lastName ) {
Person person = new Person(firstName, lastName);
// ...
}
Run Code Online (Sandbox Code Playgroud)
我想停止使用@FormParams并使用Person代替:
@PUT
public String method(@Person person) {
// ...
}
Run Code Online (Sandbox Code Playgroud)
最好的方法是什么?
我正在尝试使用自定义BodyReader,但我必须"手动"解析readFrom方法中的InputStream .
这是正确的方法吗?如果是,将InputStream转换为KEY => VALUE HashMap的最佳方法是什么?
可能的重复:
音频和视频等大文件的数据库
我正在寻找存储大量二进制数据(图像、视频、文档等)的最佳(或至少足够好)方法。该解决方案必须具有可扩展性,并且在 X 数据量之后不会陷入困境。
我想要一个地方,例如 MySQL 数据库,其中保存所有数据。当 Web 前端之一需要它时(根据请求),它可以从数据库获取它并永久缓存以供以后使用。
从这里我可以在http://dev.mysql.com/doc/refman/5.0/en/table-size-limit.html上看到MySQL 表每个表不能存储超过 4TB 的数据。是否有更合适的东西,比如 nosql 数据库,或者最好将所有内容存储在一台服务器上的文件中并将其传播到所有 Web 前端?
我希望有一个特定子类的Class'es集合来实现这样的事情:
public class Test {
private class Parent {}
private class Child1 extends Parent{}
private class Child2 extends Parent{}
List<Class<Parent>> classes = new ArrayList();
public Test() {
classes.add(Child1.class);
}
public static void main(String[] args) {
new Test();
}
}
Run Code Online (Sandbox Code Playgroud)
如何在不扰乱编译器的情况下实现上述目的?
我在3个亚马逊m3Large实例上运行Cassandra 2.0.9.
cqlsh> DESCRIBE KEYSPACE test;
CREATE KEYSPACE test WITH replication = {
'class': 'SimpleStrategy',
'replication_factor': '2'
};
Run Code Online (Sandbox Code Playgroud)
表:
cqlsh:test> DESCRIBE TABLE link_list;
CREATE TABLE link_list (
url text,
visited boolean,
PRIMARY KEY ((url))
) WITH
bloom_filter_fp_chance=0.010000 AND
caching='KEYS_ONLY' AND
comment='' AND
dclocal_read_repair_chance=0.100000 AND
gc_grace_seconds=864000 AND
index_interval=128 AND
read_repair_chance=0.000000 AND
replicate_on_write='true' AND
populate_io_cache_on_flush='false' AND
default_time_to_live=0 AND
speculative_retry='99.0PERCENTILE' AND
memtable_flush_period_in_ms=0 AND
compaction={'class': 'SizeTieredCompactionStrategy'} AND
compression={'sstable_compression': 'LZ4Compressor'};
Run Code Online (Sandbox Code Playgroud)
查询:
SELECT * FROM link_list WHERE visited = False Limit 1;
Run Code Online (Sandbox Code Playgroud)
该表有大约275,000行,并不多.有大约20个客户端尝试运行此查询并将数据插入link_list表.有些时候一切都运行顺利,但大多数时候运行select查询需要几秒钟(一致性为2).
我在visited列上有一个索引,我希望这个查询在我的设置上运行得非常快,但实际情况并非如此.能不能让我知道我做错了什么,加快一切的最好方法是什么. …