草庐IT

c# - 数据驱动测试的类/模式感知测试数据生成策略

coder 2024-05-21 原文

我最近开始在我工作的地方插入 TDD。到目前为止,一切进展顺利。我们正在编写测试,我们让它们在提交时自动运行,并且我们一直在寻求改进我们的流程和工具。

我发现可以改进的一件事是我们设置测试数据的方式。在严格的单元 测试中,我们经常发现自己实例化和填充复杂的 CLR 对象。这很痛苦,通常测试只会在少数情况下运行。

我想插入的是数据驱动测试。我认为我们应该能够从文件中加载我们的测试数据,或者甚至可以从模式中动态生成它们(尽管我只会考虑动态地这样做,如果我可以生成一个对象的每个可能的配置,那么数量配置很小)。这是我的问题。

我还没有找到为 C# CLR 对象生成测试数据的好策略。

我研究了从 XSD 生成 XML 数据,然后使用 DataSourceAttribute 将其加载到我的测试中。这似乎是个好方法,但我在生成 XSD 文件时遇到了麻烦。 xsd.exe 失败是因为我们的类有接口(interface)成员。我还尝试在我们的程序集上使用 svcutil.exe,但由于我们的代码是单一的,所以输出非常庞大且棘手(许多相互依赖的 .xsd 文件)。

生成测试数据的其他技术有哪些?理想情况下,生成器将遵循模式(可能是 xsd,但最好是类本身),并且可以编写脚本。 技术说明(不确定这是否相关,但无妨):

  • 我们正在使用 Visual Studio 的单元测试框架(在 Microsoft.VisualStudio.TestTools.UnitTesting 中定义)。
  • 我们正在使用 RhinoMocks

谢谢

额外信息

我对此感兴趣的一个原因是测试我们拥有的Adapter 类。它需要一个复杂而令人费解的遗留实体,并将其转换为 DTO。遗留实体是一团乱七八糟的意大利面条,不能轻易地分成由接口(interface)定义的逻辑子单元(如建议的那样)。这将是一个不错的方法,但我们没有那么奢侈。

我希望能够生成此遗留实体的大量配置并通过适配器运行它们。配置的数量越多,当下一个开发人员(对 90% 的应用程序一无所知)更改遗留实体的模式时,我的测试失败的可能性就越大。

更新

澄清一下,我不打算为每次执行的测试生成随机数据。我希望能够生成数据以涵盖复杂对象的多种配置。我想离线生成此数据并将其存储为测试的静态输入。

我刚刚重读了我的问题并注意到我实际上最初要求随机生成。我很惊讶我会这样要求!我已经更新了问题以解决该问题。抱歉造成混淆。

最佳答案

您需要的是诸如 NBuilder ( http://code.google.com/p/nbuilder ) 之类的工具。

这允许您描述对象,然后生成它们。这非常适合单元测试。

这是一个非常简单的示例(但您可以根据需要将其复杂化):

var products = Builder<Product>
                   .CreateListOfSize(10)
                   .All().With(x => x.Title = "some title")
                   .And(x => x.AnyProperty = RandomlyGeneratedValue())
                   .And(x => x.AnyOtherProperty = OtherRandomlyGeneratedValue())
                   .Build();

关于c# - 数据驱动测试的类/模式感知测试数据生成策略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20346927/

有关c# - 数据驱动测试的类/模式感知测试数据生成策略的更多相关文章

  1. ruby-on-rails - 使用 Ruby on Rails 进行自动化测试 - 最佳实践 - 2

    很好奇,就使用ruby​​onrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提

  2. ruby-on-rails - Rails - 子类化模型的设计模式是什么? - 2

    我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co

  3. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  4. ruby - 使用 C 扩展开发 ruby​​gem 时,如何使用 Rspec 在本地进行测试? - 2

    我正在编写一个包含C扩展的gem。通常当我写一个gem时,我会遵循TDD的过程,我会写一个失败的规范,然后处理代码直到它通过,等等......在“ext/mygem/mygem.c”中我的C扩展和在gemspec的“扩展”中配置的有效extconf.rb,如何运行我的规范并仍然加载我的C扩展?当我更改C代码时,我需要采取哪些步骤来重新编译代码?这可能是个愚蠢的问题,但是从我的gem的开发源代码树中输入“bundleinstall”不会构建任何native扩展。当我手动运行rubyext/mygem/extconf.rb时,我确实得到了一个Makefile(在整个项目的根目录中),然后当

  5. ruby - Ruby 的 Hash 在比较键时使用哪种相等性测试? - 2

    我有一个围绕一些对象的包装类,我想将这些对象用作散列中的键。包装对象和解包装对象应映射到相同的键。一个简单的例子是这样的:classAattr_reader:xdefinitialize(inner)@inner=innerenddefx;@inner.x;enddef==(other)@inner.x==other.xendenda=A.new(o)#oisjustanyobjectthatallowso.xb=A.new(o)h={a=>5}ph[a]#5ph[b]#nil,shouldbe5ph[o]#nil,shouldbe5我试过==、===、eq?并散列所有无济于事。

  6. ruby - 如何在续集中重新加载表模式? - 2

    鉴于我有以下迁移:Sequel.migrationdoupdoalter_table:usersdoadd_column:is_admin,:default=>falseend#SequelrunsaDESCRIBEtablestatement,whenthemodelisloaded.#Atthispoint,itdoesnotknowthatusershaveais_adminflag.#Soitfails.@user=User.find(:email=>"admin@fancy-startup.example")@user.is_admin=true@user.save!ende

  7. ruby - RSpec - 使用测试替身作为 block 参数 - 2

    我有一些Ruby代码,如下所示:Something.createdo|x|x.foo=barend我想编写一个测试,它使用double代替block参数x,这样我就可以调用:x_double.should_receive(:foo).with("whatever").这可能吗? 最佳答案 specify'something'dox=doublex.should_receive(:foo=).with("whatever")Something.should_receive(:create).and_yield(x)#callthere

  8. ruby - Sinatra:运行 rspec 测试时记录噪音 - 2

    Sinatra新手;我正在运行一些rspec测试,但在日志中收到了一堆不需要的噪音。如何消除日志中过多的噪音?我仔细检查了环境是否设置为:test,这意味着记录器级别应设置为WARN而不是DEBUG。spec_helper:require"./app"require"sinatra"require"rspec"require"rack/test"require"database_cleaner"require"factory_girl"set:environment,:testFactoryGirl.definition_file_paths=%w{./factories./test/

  9. ruby-on-rails - 迷你测试错误 : "NameError: uninitialized constant" - 2

    我遵循MichaelHartl的“RubyonRails教程:学习Web开发”,并创建了检查用户名和电子邮件长度有效性的测试(名称最多50个字符,电子邮件最多255个字符)。test/helpers/application_helper_test.rb的内容是:require'test_helper'classApplicationHelperTest在运行bundleexecraketest时,所有测试都通过了,但我看到以下消息在最后被标记为错误:ERROR["test_full_title_helper",ApplicationHelperTest,1.820016791]test

  10. ruby - 即使失败也继续进行多主机测试 - 2

    我已经构建了一些serverspec代码来在多个主机上运行一组测试。问题是当任何测试失败时,测试会在当前主机停止。即使测试失败,我也希望它继续在所有主机上运行。Rakefile:namespace:specdotask:all=>hosts.map{|h|'spec:'+h.split('.')[0]}hosts.eachdo|host|begindesc"Runserverspecto#{host}"RSpec::Core::RakeTask.new(host)do|t|ENV['TARGET_HOST']=hostt.pattern="spec/cfengine3/*_spec.r

随机推荐