unit testing一个不返回任何东西的方法的最好方法是什么? 具体在C#中。 我真正想要testing的是一种方法,它需要一个日志文件并为特定的stringparsing它。 这些string然后被插入到数据库中。 什么都没有做过,但对TDD很新,我想知道是否有可能testing这是否是真的没有得到testing。
unit testing和functiontesting有什么区别? unit testing也可以testing一个函数吗?
甚至一个简单的Python模块的通用目录结构似乎是将unit testing分离到他们自己的test目录中: new_project/ antigravity/ antigravity.py test/ test_antigravity.py setup.py etc. 例如看到这个Python项目howto 。 我的问题只是实际运行testing的常用方法是什么? 我怀疑这是除了我以外的每个人都很明显,但是你不能只从testing目录运行python test_antigravity.py ,因为import antigravity python test_antigravity.py将失败,因为模块不在path上。 我知道我可以修改PYTHONPATH和其他searchpath相关的技巧,但我不能相信这是最简单的方法 – 如果你是开发人员,这很好,但如果他们只是想检查testing是不现实的,通过。 另一种方法是将testing文件复制到另一个目录中,但似乎有点笨拙,并且错过了将它们放在一个单独的目录中的要点。 所以,如果你刚刚把源代码下载到我的新项目中,你将如何运行unit testing? 我更喜欢一个答案,让我对我的用户说:“运行unit testing做X.”
我只是碰巧实现一个方法void followlink(obj page,obj link) ,它只是添加页面和链接到队列。 我没有试图testing这种方法。 我只想testing在队列中包含从followlink方法收到的页面和链接。 我的testing类已经扩展了TestCase。 那么testing这种方法的最好方法是什么?
Visual Studio允许通过自动生成的访问器类对私有方法进行unit testing。 我写了一个testing成功编译的私有方法,但在运行时失败。 代码的相当小的版本和testing是: //in project MyProj class TypeA { private List<TypeB> myList = new List<TypeB>(); private class TypeB { public TypeB() { } } public TypeA() { } private void MyFunc() { //processing of myList that changes state of instance } } //in project TestMyProj public void MyFuncTest() { TypeA_Accessor target = new […]
我看到很多问题都是以单一的语言进行unit testing,而不是问“什么”,“为什么”和“何时”。 它是什么? 它对我有什么作用? 我为什么要用它? 我应该什么时候使用它(当不是)? 什么是一些常见的陷阱和误解
我知道日志logging是AOP的主要用例。 此外,还要logging日志包装器,以便您可以使用DI,以便类不会与特定的日志logging实现结合使用。 但是, 有些人认为logging包装是一种反模式 。 首先,这样的观点是因为在大多数情况下,包装往往是简单的,并删除了日志框架的许多特定的function。 如果你实现这些特定的function,为什么不直接使用框架。 我意识到Common.Logging外观试图为您抽象log4Net,EntLib,NLog的大量function。 但是,即使在这里,我们仍然对Common.Logging有各种依赖。 不是在接口等代码/unit testing方式,但如果项目死亡(自上个版本已经超过一年),或者你希望后者切换到不支持的logging器,可能会导致问题。 也就是说, 如果通过AOP来实现日志logging,甚至有必要使用DI作为日志依赖 (也就是说为什么不直接引用NLog)? 是的,代码的AOP部分将被紧密耦合,但是人们想要unit testing的类的逻辑没有日志依赖性(至less在编织发生之前)。 在这一点上,我有点失落(我还没有尝试过AOP)。 编织之后,会不会有AOP代码使用DI导致unit testing方法出现问题? 或者可以一个unit testing而不编织AOP代码? 除非日志logging是软件用户的要求,否则我不确定testing日志logging是否发生在mock中是多么有用。 我认为被测方法的业务逻辑是大多数人对testing感兴趣的。 最后,如果想要使用TDD / BDD,那么在AOP代码中不需要使用DI进行日志logging依赖关系吗? 或者只是不试驾 AOP的一面呢? 正如你所看到的,我试图去感受一下开发一个应用程序的最实际的方法是什么,这个应用程序可以同时使用AOP和横向关注以及DI进行devise/testing。 由于AOP是相对较新的,日志logging是最常见的例子,所推荐的方法是什么?
鉴于软件在哪里… 该系统由几个子系统组成 每个子系统由几个组件组成 每个组件都使用很多类来实现 …我喜欢编写每个子系统或组件的自动化testing。 我不写一个组件的每个内部类的testing(因为每个类都有助于组件的公共function,因此可以通过组件的公共API从外部testing/testing)。 当我重构组件的实现时(我经常这样做,作为添加新function的一部分),因此我不需要改变任何现有的自动化testing:因为testing只依赖于组件的公共API和公共API通常是扩大而不是改变。 我认为这个政策与像重构testing代码 ( Refactoring Test Code )这样的文档形成了鲜明的对比。 “…unit testing…” “…系统中每个class的testing课程…” “…testing代码/生产代码比…理想地认为接近1:1的比率…” …我想所有这些我都不同意(或者至less不练习)。 我的问题是,如果你不同意我的政策,你会解释为什么吗? 这种testing程度在哪些情况下不足? 综上所述: 公共接口被testing(并重新testing),很less发生变化(它们被添加到但很less被修改) 内部API隐藏在公共API的后面,可以在不改写testing公共API的testing用例的情况下进行更改 脚注:我的一些“testing用例”实际上是作为数据实现的。 例如,UI的testing用例由包含各种用户input的数据文件和相应的预期系统输出组成。 testing系统意味着具有testing代码,其读取每个数据文件,将input重放到系统中,并声明它获得相应的期望输出。 尽pipe我很less需要更改testing代码(因为公共API通常被添加到而不是被改变),但是我确实发现有时(例如每周两次)需要改变一些现有的数据文件。 这可能会发生在我更改系统输出时(即新function改进了现有输出),这可能会导致现有testing“失败”(因为testing代码只会试图断言输出没有改变)。 为了处理这些情况,我做了以下工作: 重新运行自动化testing套件,该testing套件包含一个特殊的运行时间标志,该标志告诉它不声明输出,而是将新的输出捕捉到一个新的目录 使用可视化差异工具来查看哪些输出数据文件(即,哪些testing用例)已经改变,并且鉴于新function,validation这些改变是好的并且如预期的那样 通过将新目录中的新输出文件复制到运行testing用例的目录(覆盖旧testing)来更新现有testing 脚注:“组件”是指像“一个DLL”或“一个程序集”这样的东西……这个东西足够大,可以在系统的体系结构或部署图上看到,通常使用几十个或100个类来实现,使用一个只包含大约1个或几个接口的公共API …可以分配给一个开发团队(将不同的组件分配给不同的团队)的东西,因此根据Conway定律一个相对稳定的公共API。 脚注:文章面向对象testing:神话与现实说, 神话:黑盒testing就足够了。 如果你使用类接口或规范来做testing用例devise的细致工作,那么你可以放心,这个类已经被充分运用了。 白盒testing(看一个方法的实现来devisetesting)违反了封装的概念。 现实:面向对象的结构问题,第二部分。 许多研究表明,开发人员认为彻底彻底的黑盒testing套件只能在被testing的实现中使用三分之一到一半的语句(更不用说path或状态)。 这有三个原因。 首先,所select的input或状态通常会执行正常path,但不会强制所有可能的path/状态。 其次,黑盒testing本身并不能揭示出惊喜。 假设我们已经testing了被测系统的所有指定行为。 为了确信没有不明确的行为,我们需要知道系统的任何部分是否未被黑盒testing套件行使。 这个信息可以通过代码工具获得。 第三,在不检查源代码的情况下常常难以执行exception和error handling。 我应该补充一点,我正在做白盒functiontesting:我看到了代码(在实现中),我编写了functiontesting(驱动公共API)来执行各种代码分支(function实现的细节)。
.NET中有相当多的unit testing框架。 我发现这个小function比较: http : //xunit.github.io/docs/comparisons.html 现在我要为我们select最好的一个。 但是,如何? 有关系吗? 哪一个是最有前途的证据,并有一个体面的动力呢? 我应该关心这些function吗? 虽然xUnit似乎是最现代化的,专门为.NETdevise的,NUnit似乎再次被广泛接受。 MSTest再次已经集成到Visual Studio中…
我知道我是如何使用这些术语的,但是我想知道是否有可接受的用于unit testing的伪造 , 嘲弄和剔除的定义? 你如何定义这些testing? 描述你可能使用的情况。 以下是我如何使用它们: Fake :实现接口但包含固定数据和无逻辑的类。 根据实施情况简单地返回“好”或“坏”数据。 模拟(Mock) :一个实现了接口的类,允许dynamic设置值的返回/exception,从特定方法抛出,并提供检查特定方法是否被调用/未调用的能力。 存根 :就像一个模拟类,除了它没有提供validation方法被调用/不被调用的能力。 嘲笑和存根(stub)可以由手工生成或由嘲笑框架生成。 假类是手工生成的。 我主要使用mock来validation我的类和相关类之间的交互。 一旦我validation了交互,并使用我的代码testing替代path,我使用了存根(stub)。 我主要使用假类来抽象出数据的依赖关系,或者当模拟/存根(stub)过于繁琐而无法每次设置时。