我正在学习Docker Swarm模式,我设法在本地创建一个带有Web应用程序和PostgreSQL数据库的Swarm.我可以扩展它们,我看到Swarm创建了副本.
我想我理解Docker Swarm 如何对常规Web服务器进行负载均衡,但它如何与数据库容器一起开箱即用?
在Swarm上下文之外,通常数据库有自己的方式来处理复制,以插件或MySQL集群等扩展产品的形式.像Cassandra这样的其他数据库已经直接在他们的产品中构建了复制.在Swarm上下文中,我们是否还需要依赖这些数据库插件和功能?
处理数据库容器副本之间数据一致性的预期模式是什么?
我知道这是一个非常开放的问题,但Docker的文档也是非常开放的,我似乎无法找到任何具体的内容.
不仅仅是一个实际案例,这是我在试图获得单元测试和集成测试之间的详细差异时遇到的问题.
假设我有类Sum,它增加了两个整数:
class Sum{
int x;
int y;
public int add(){
return x + y;
}
...getters and setters...
}
Run Code Online (Sandbox Code Playgroud)
我还有另一个负责验证结果的类,以确认值是预期的.仅举例来说,假设我们只想添加正数:
class ValidateSum{
Sum sum;
public boolean validate(){
if(sum.getX()>=0 and sum.getY()>=0){
return true;
}
else{
return false;
}
}
... getters and setters...
}
Run Code Online (Sandbox Code Playgroud)
拥有ValidateSum可能没有多大意义,但我们只是为了举例而假设它.
现在我想为ValidateSum编写测试.如果我这样做:
@Test
public void testValidateSum(){
ValidateSum vs = new ValidateSum();
Sum sum = new Sum();
vs.setSum(sum);
boolean result = vs.validate();
assertTrue(result);
}
Run Code Online (Sandbox Code Playgroud)
这是单元测试还是集成测试?
我知道单元测试只需验证ValidateSum中的功能,并且在某种程度上测试是这样做的:它只从Sum获取属性,而不是它的任何功能.
但另一方面,你也可以说你正在从Sum访问功能,即使ValidateSum只调用一个getter.Sum的getter的任何变化都会影响ValidateSum的测试,打破了单元测试的概念.
但如果是这种情况并且确实是集成测试,那么我如何为ValudateMethod的validate()编写单元测试?
我唯一想不到的是嘲笑Sum,所以它返回相同的值.即使Sum的getter中的逻辑发生变化,ValidateSum的测试也将保持不变.问题是,getter的模拟响应可能会增加不必要的复杂性,因为getter中逻辑更改的可能性非常低,而我们所做的只是获取属性.
我希望我的问题有道理,这更多是理论上的疑问.
编辑
谢谢您的回答.他们有重要的事情需要考虑.我选择的最佳答案之一是因为它引导我:
http://www.mockobjects.com/2007/04/test-smell-everything-is-mocked.html
它是真的:从理论上讲,我必须模拟Sum,这样才能成为一个纯粹的单元测试.但是对于大多数情况来说,增加复杂性的成本以及模拟属性获取者所花费的精力并不值得进行"最纯粹的"单元测试,而在实际情况下,单元和集成测试之间的差异是主观的.
database ×1
docker ×1
docker-swarm ×1
java ×1
mocking ×1
postgresql ×1
testing ×1
unit-testing ×1