标签: modular

模块化应用程序堆栈中的虚拟数据和单元测试策略

如何管理用于测试的虚拟数据?将它们与各自的实体保持一致?在一个单独的测试项目中?使用外部资源的Serializer加载它们?或者只是在需要的地方重新创建它们?

我们有一个应用程序堆栈,其中包含多个模块,具体取决于另一个模块.每个模块都有自己的测试,需要运行虚拟数据.

现在,具有大量依赖性的模块将需要来自其他模块的大量虚拟数据.然而,那些不发布它们的虚拟对象,因为它们是测试资源的一部分,因此所有模块必须一次又一次地设置它们需要的所有虚拟对象.

另外:我们实体中的大多数字段都不可为空,因此即使针对对象层运行事务也要求它们包含一些值,大多数情况下还有其他限制,如唯一性,长度等.

是否有最佳实践方法或所有解决方案都妥协?


更多详情

我们的堆栈看起来像这样:

一个模块:

src/main/java --> gets jared (.../entities/*.java contains the entities)
src/main/resources --> gets jared
src/test/java --> contains dummy object setup, will NOT get jared
src/test/resources --> not jared
Run Code Online (Sandbox Code Playgroud)

我们使用Maven来处理依赖关系.

模块示例:

  • 模块A有一些虚拟对象
  • 模块B需要自己的对象,与模块A相同

选项a)

测试模块T可以容纳所有虚拟对象,并将它们提供给所有模块中的所有测试中的测试范围(因此加载的依赖关系不会受到影响).那会有用吗?含义:如果我加载牛逼一个并运行安装在一个将它不含有引入引用牛逼特别是没有B?然而A会知道B的数据模型.

选项b)

模块A在某处提供虚拟对象,src/main/java../entities/dummy允许B获取它们,而A不知道B的虚拟数据

选项c)

每个模块都包含外部资源,它们是序列化的虚拟对象.它们可以由需要它们的测试环境反序列化,因为它依赖于它们所属的模块.这将需要每个模块创建和序列化其虚拟对象,以及如何做到这一点?如果使用另一个单元测试,它会引入不应该发生的单元测试之间的依赖关系,或者使用脚本,它将很难调试而且不灵活.

选项d)

使用模拟框架并根据需要手动为每个测试分配必需的字段.这里的问题是我们实体中的大多数字段都不可为空,因此需要调用setter或构造函数,这将使我们在开始时再次结束.

我们不想要的

我们不希望使用静态数据设置静态数据库,因为所需对象的结构将不断变化.很多,现在,稍晚一点.所以我们希望hibernate设置所有表和列,并在单元测试时填充数据.静态数据库也会引入许多潜在错误并测试相互依赖性.


我的想法是否朝着正确的方向发展?处理需要大量数据的测试的最佳做法是什么?我们将有几个相互依赖的模块,它们需要填充来自其他几个模块的某种数据的对象.


编辑

关于我们现在如何回应第二个答案的更多信息:

所以为了简单起见,我们有三个模块:Person, …

java testing unit-testing modular maven

10
推荐指数
1
解决办法
6711
查看次数

如何使用requireJS访问模块变量?

我已经使用Javascript了一段时间,我刚刚尝试过使用模块和requireJS,这很难让我对新的设计模式有所了解!

这是我的第一次尝试:

require([
    "jquery",
    "testModule"
], function ($, testModule) {
    $(function () {
        var testInstance1 = testModule;
        testInstance1.setID(11);
        alert(testInstance1.id);
    });
});
Run Code Online (Sandbox Code Playgroud)

和testModule.js

define([
  'jquery'
], function ($) {

    var id = 0;

    var setID = function (newID) {
        id = newID;
        return id;
    };
    return {
        setID: setID,
        id:id
    };
});
Run Code Online (Sandbox Code Playgroud)

这返回0,我期待11.我错过了什么?

当然,它也是一个简化的例子.我想创建多个对象,每个对象应保持自己的状态变量.例如,如果我想要一个模块将一个列表附加到一个容器,DIV但是还包含要添加的函数,清除或查询该列表中的数据,我应该如何构建模块函数,以便每个实现都保持自己的状态.

谢谢

javascript design-patterns amd modular requirejs

10
推荐指数
1
解决办法
7809
查看次数

Spring和Maven的模块化Web应用程序

我正在尝试用Java设计中型Web应用程序的体系结构,我想得到一些关于如何做的建议.

该项目包括基础网站和许多模块.例如,一个模块将提供用户注册,另一个模块将提供Web服务,等等......

每当我需要将应用程序交付给新客户时,最理想的方法是获取他想要的模块,做一些主题(css,图像,也许是jsp)并开发他可能需要的自定义模块(如果有的话).

我已经看过maven多模块项目,战争覆盖,但我发现很难对应用程序进行分区,特别是在模块的配置方面(例如,从模块中合并全局弹簧配置).有人能指出我这样一个系统的例子吗?提前致谢!

java web-applications spring-mvc modular maven

10
推荐指数
1
解决办法
4271
查看次数

使用Haskell类型系列或GADT的模块化算法?

我经常有机会在Haskell中执行模运算,其中模数通常较大且通常为素数(如2000000011).目前,我只使用像(modAdd mab),(modMul mab),(modDiv mab)等函数.但这样做相当不方便,需要一个额外的参数来始终指定和携带并在常规积分中创建我的各种函数形式和单独的模型.

因此,创建一个类似这样的新类可能是个好主意:

class Integral a => Mod a

m = 2000000011

instance Integral a => Num (Mod a) where
   ... defining (+), etc. as modulo m
Run Code Online (Sandbox Code Playgroud)

然后可以使用常规函数执行常规算术,并定义有用的结构,如

factorials :: [Mod Int]
factorials = 1:zipWith (*) factorials [1..]
Run Code Online (Sandbox Code Playgroud)

但这有一个问题:Mod Int类型的所有值必须具有相同的模数.但是,我经常需要在一个程序中使用多个模数(当然总是只组合相同模数的值).

我想,但是不能完全理解,这可以通过以下方式克服:

class Integral a => Mod Nat a
Run Code Online (Sandbox Code Playgroud)

其中Nat是一种以Peano方式编码模数的类型.这将是有利的:我可以具有不同模量的值,并且类型检查器将使我免于意外地组合该值.

这样的事情是否可行和有效?它是否会导致编译器或RTS尝试实际构建巨大的(Succ(Succ(重复...重复2000000011次)如果我尝试使用该模数,使解决方案无效?RTS是否会尝试检查在每个操作上都匹配类型吗?每个值的RTS表示是否会从一个只有一个未装箱的int中被炸毁?

有没有更好的办法?

结论

感谢来自cirdec,dfeuer,user5402tikhon-jelvis的有用评论,我了解到(不出所料)我不是第一个有这个想法的人.特别是,Kiselyov和Shan 最近的一篇论文给出了一个实现,并且tikhon-jelvis向Hackage发布了一个名为(surprise!)模块算术的解决方案,它使用花哨的ghc pragma提供更好的语义.

开放式问题(对我而言)

幕后会发生什么?特别是,[Mod Int 2000000011]的百万元素清单是否会带来额外的200万份20000000左右?或者它是否编译为与一百万个Int的列表相同的代码,其中模数参数单独携带?后者会很好.

关于性能的补充

我对当前正在处理的问题进行了一些基准测试.第一次运行使用了未装箱的10,000元素Int向量,并对其执行了10,000次操作:

   4,810,589,520 bytes allocated …
Run Code Online (Sandbox Code Playgroud)

haskell modular ghc type-families gadt

9
推荐指数
1
解决办法
353
查看次数

如何编写灵活的模块化程序,模块之间具有良好的交互可能性?

我在这里搜索了类似主题的答案但是找不到令人满意的答案.既然我知道这是一个相当大的话题,我会尝试更具体.

我想写一个处理文件的程序.处理是非常重要的,所以最好的方法是将不同的阶段分成独立的模块,然后根据需要使用(因为有时我只对模块A的输出感兴趣,有时我需要输出其他五个模块,等等).问题是,我需要模块合作,因为一个模块的输出可能是另一个模块的输入.我需要它快速.此外,我想避免多次执行某些处理(如果模块A创建了一些数据,然后需要由模块B和C处理,我不想运行模块A两次来创建模块B,C的输入) .

模块需要共享的信息主要是二进制数据块和/或处理文件的偏移量.主程序的任务非常简单 - 只需解析参数,运行所需的模块(也许可以给出一些输出,或者这应该是模块的任务?).

我不需要在运行时加载模块.使用带有.h文件的库并且每次有新模块或某个模块更新时重新编译程序都是完美的.模块的概念主要是因为代码可读性,维护和能够让更多的人在不同的模块上工作,而不需要有一些预定义的接口或其他任何东西(另一方面,关于如何编写的一些"指南")可能需要模块,我知道).我们可以假设文件处理是只读操作,原始文件不会更改.

有人能指出我如何在C++中做到这一点吗?任何建议都很好(链接,教程,pdf书籍......).

c++ architecture modular

8
推荐指数
1
解决办法
7576
查看次数

unde的方法`run'for main:Object(NoMethodError)Sinatra

require 'sinatra/base'

class Foo < Sinatra::Base
  get('/foo') { 'foo' }
end

class Bar < Sinatra::Base
  get('/bar') { 'bar' }
end

run Rack::Cascade, [Foo, Bar]
Run Code Online (Sandbox Code Playgroud)

我猜不出这段代码有什么问题.当我运行:ruby server.rb时,它会抛出一个错误

modular sinatra

7
推荐指数
1
解决办法
7418
查看次数

函数和模块之间的差异是什么?

我对c ++很新,并且模糊编程面向函数编程之间的区别很困惑.我从未完成模块化编程,所以我只知道模块的定义,它包含函数.所以顺序之间有什么区别(函数 -面向语言)和模块化编程?提前感谢.

编辑: 我正在阅读关于C++的OOP.It开始类似于非结构化编程,而不是模块化编程,最后是OOP,而不是结构化编程的基本概念.

functional-programming modular

6
推荐指数
1
解决办法
1万
查看次数

c ++中大数字的模乘

我有三个整数A,B(小于10 ^ 12)和C(小于10 ^ 15).我想计算(A*B)%C.我知道

(A * B) % C = ((A % C) * (B % C)) % C
Run Code Online (Sandbox Code Playgroud)

但是如果A = B = 10 ^ 11,那么上面的表达式将导致整数溢出.对于上述情况是否有任何简单的解决方案,或者我必须使用快速乘法算法.

如果我必须使用快速乘法算法,那么我应该使用哪种算法.

编辑:我在C++中尝试过上述问题(不会导致溢出,不确定原因),但答案应该是吗?

提前致谢.

c++ algorithm multiplication modular

6
推荐指数
2
解决办法
7663
查看次数

这种编程方法叫什么?这不好吗?

最近在我的Unity项目中,我发现要创建一个更模块化的应用程序,它有助于在类中包含一个静态List,该类包含对所有或部分创建的对象的引用,以便可以从程序的其他部分轻松访问它们. .一个例子如下:

private static List<Canvas> availableCanvases = new List<Canvas>();

void Start () {
    availableCanvases.Add(this);
}

public static void AddComponentToCanvas(Transform component) {
    for (int i = 0; i < availableCanvases; i++) {
        //Make sure the canvas still exists
        if (availableCanvases[i] != null) {
            component.SetParent(availableCanvases[i]);
            return;
        } else {
            availableCanvases.RemoveAt(i);
            i--;
        }
    }

    //Reached if no canvas found
    //Create new canvas or create error etc...
}
Run Code Online (Sandbox Code Playgroud)

这只是允许在运行时实例化的对象将自己添加到可用的画布而不需要通过findWithTag或findWithType方法访问它,如果使用太多则会损害性能.

这是不好的做法还是好的?我的同事认为这代表单例编程,但它当然不是因为它允许存在多个对象并被使用.

c# modular unity-game-engine

6
推荐指数
1
解决办法
124
查看次数

欧几里德算法求解RR' - NN'= 1.利用蒙哥马利算法进行模幂运算,在python或Petite Chez方案中实现Fermat检验

这在我使用Scheme教授的入门编程课程中是个人挑战,但我对Python示例同样满意.

我已经在方案中实现了模幂运算的二进制方法,如下所示:

(define (pow base expo modu)
  (if (zero? expo)
      1
      (if (even? expo)
          (mod (expt (pow base (/ expo 2) modu) 2) modu)
          (mod (* base (pow base (sub1 expo) modu)) modu))))
Run Code Online (Sandbox Code Playgroud)

这是必要的,因为Chez Scheme没有任何类似于python的pow(base expo modu)的实现.

现在我正在尝试实现解决模乘的蒙哥马利方法.举个例子,我有:

Trying to solve:
    (a * b) % N
N = 79
a = 61
b = 5
R = 100
a' = (61 * 100) % 79 = 17
b' = (5 * 100) % 79 = 26
RR' - NN' = …
Run Code Online (Sandbox Code Playgroud)

algorithm scheme modular exponentiation chez-scheme

5
推荐指数
1
解决办法
476
查看次数