小编Kev*_*Won的帖子

当测试失败时,代码库与测试断言的"正常"比率是什么?

我正在开发一个项目,其中包含一些相当重要的业务规则,当我们编写解决方案时,问题空间被"发现"(非常典型的混乱项目管理类型).我们拥有不错的测试覆盖率并且相当依赖它们以确保我们的重大变化不会造成任何影响.这种情况是单元测试狂热者强调的一个主要例子,即如果你不使用单元测试,那么测试帮助软件可以立即轻松修改,缺陷更少,更快完成.我不禁思考如何在没有测试套件的情况下应对.

我的问题是,虽然我当然相信单元测试的价值(这个项目实际上是TDD,但它与问题没有密切关系),我和其他人一样,想知道有这么多的经典单元测试问题用于修改和维护的代码(即测试本身).再次.毫无疑问,我认为这个特别的项目在单元测试方面要好得多,没有它,我也关注测试的长期可维护性.

我根据其他人的建议使用了一些技术来帮助解决这个问题.一般来说,

  1. 我们创建了一个"依赖"与"独立"桶中的测试列表.独立测试不需要任何不受源代码控制的东西.因此,对我们的数据访问层的任何调用都是模拟或从xml文件而不是真实数据库获取数据.名称建议的依赖测试取决于配置文件或数据库或网络事物,在运行测试时可能无法正确配置/可用.将测试分成这样的组对于允许我们编写依赖的"丢弃"测试以进行早期开发和独立的任务关键测试(可以依赖并重新测试腐烂)非常有用.它还使CI服务器易于管理,因为它不必设置和维护数据库连接等.
  2. 我们针对不同级别的代码.例如,我们有测试命中'main'并测试命中'main'会调用的所有方法.这使我们能够定位系统的细节和总体目标.如果"主要"测试中断,它们很难调试,但它们通常不是唯一中断的(详细测试也会中断).如果它们中断,则更容易遵循详细测试并调试它们但是它们不足以知道重构是否会导致系统崩溃(这就是'主要'测试的用途).
  3. "主要"测试至关重要,因为重构没有给代码库带来麻烦.因此,对于使用映射到用例的不同args调用的单个方法,"主要"测试就像许多测试一样.它基本上是我们在最高级别的代码的入口点,因此可以说不是真正的"单元"测试.但是,我发现我真的需要更高级别的测试,以便感觉很舒服,重构没有炸毁代码库.较低级别的测试(那些真正"工作单位"的测试是不够的.

这一切都是为了解决这个问题.随着项目向前发展,我发现我需要对代码库实施更改(有时非常重要,有时是微不足道的),我发现当更改导致测试失败时,测试失败与实际回归业务逻辑失败和单元之间存在比率测试无效.换句话说,有时测试失败是因为实际代码库中存在回归错误,有时这是因为单元测试断言不再有效,而且是需要更改的断言.似乎粗略地说,当测试失败时,它对于这个特定的项目来说差不多(50%).

有没有人在他们的项目中跟踪这个比例,如果有的话,你对这个比例学到了什么(如果有的话)?我不确定它是否表明任何东西,但我注意到大约一半的测试失败导致我调整测试断言,而不是实际修复真实代码库中的回归错误.无论何时发生这种情况,都会让我觉得我只是浪费了一天中的x小时,我想知道我是否可以通过我的测试方法更有效率.解决测试断言失败通常比实际的回归错误需要更长的时间,而这些错误既有反作用又令人沮丧.

编辑 注意这个问题是关于探索这个比率意味着什么以及你对这个比率的体验.它什么时候"臭"?

testing tdd unit-testing

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

C#中的重要空白如Python或Haskell?

我想知道是否有任何其他C#开发人员会发现它有一个改进,有一个编译器指令,csc.exe以使空白显着的空间Haskell或Python,其中各种类型的空白创建代码块.

虽然这肯定会远离C风格的语言,但在我看来,由于C#最终被编译成CIL(它仍然有大括号和分号),它实际上只是编译器可以解析的技巧.处理任何一种方式(也就是说,它可以处理重要的空格或不处理).由于curlies和分号通常是进入C#的障碍,它们实际上只是解析帮助程序(它们本身并没有赋予你的代码含义),所以它们可以被删除为Haskell/Python.

F#使用#light编译器指令处理它,您可以在F#1.1.12.3中的Lightweight语法选项中阅读该指令.

我想在C#中看到同样的事情:#SigSpace或某些指令,它会csc.exe像空白一样直接将源视为Haskell文件(仅作为示例).

标准C#:

public void WhiteSpaceSig()
{
    List<string> names = new List<string>();
    List<string> colors = new List<string>();

    foreach (string name in names)
    {
        foreach (string color in colors)
        {
            // bla bla bla
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

重要的空白:

#SigSpace

    public void WhiteSpaceSig()

        List<string> names = new List<string>()
        List<string> colors = new List<string>()

        foreach (string name in names)
            foreach (string color in colors)
                // bla bla bla
Run Code Online (Sandbox Code Playgroud)

我并不是说我想在C#中使用它,但我对这些权衡是什么感兴趣.我的猜测是,大多数C#开发人员已经习惯了语法,以至于他们无法看到它是多么模仿(尽管它最终可能使代码更容易阅读).

c# python haskell

8
推荐指数
2
解决办法
1244
查看次数

来自流阅读器的F#懒惰eval?

我遇到了我的代码中的一个错误,这让我觉得我并不真正理解有关F#和懒惰评估的一些细节.我知道F#急切地评估,因此我对以下函数感到有些困惑:

// Open a file, then read from it. Close the file. return the data.
let getStringFromFile =  
    File.OpenRead("c:\\eo\\raw.txt")
    |> fun s -> let r = new StreamReader(s)
                let data = r.ReadToEnd
                r.Close()
                s.Close()
                data
Run Code Online (Sandbox Code Playgroud)

当我在FSI中称呼它时:

> let d = getStringFromFile();;

System.ObjectDisposedException: Cannot read from a closed TextReader.

at System.IO.__Error.ReaderClosed()
at System.IO.StreamReader.ReadToEnd()
at <StartupCode$FSI_0134>.$FSI_0134.main@()
Stopped due to error
Run Code Online (Sandbox Code Playgroud)

这让我觉得这getStringFromFile是懒惰的评价 - 所以我完全糊涂了.我没有得到关于F#如何评估函数的信息.

evaluation f# eager lazy-evaluation

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

日期范围的F#生成器?

我正在尝试编写一个使用生成器语法生成DateTimes列表的函数:

let dateRange = 

    let endDate = System.DateTime.Parse("6/1/2010")
    let startDate = System.DateTime.Parse("3/1/2010")

    seq {
          for date in startDate..endDate do
              if MyDateClass.IsBusinessDay(date) then yield date
        }
Run Code Online (Sandbox Code Playgroud)

但生成器('seq')块无法正确解析.它需要一个时间跨度.虽然生成器语法看起来非常适合我想要做的事情,但除了两个数字之外的任何东西都是非直观的.

  1. 是否可以使用生成器语法来创建DateTime范围?
  2. 是否有更好的方式来思考如何创建范围比我写的(即'in'子句)

f# generator

5
推荐指数
2
解决办法
779
查看次数

在Windows 7上使用Visual Studio 2010和语音识别?

我从来没有使用语音识别(SR),但我听说Windows 7的内置SR功能并不是坏事.我认为它可能是Visual Studio真正的生产力助推器所以我可以减少鼠标的使用(请不要使用Emacs评论;-).我没有想到不使用键盘输入实际的代码 - 但也许这也会起作用?

有没有人在Windows 7上使用SR和Visual Studio的经验?若然,有关使用方法的提示吗?

speech-recognition visual-studio-2010

3
推荐指数
1
解决办法
2400
查看次数

带有递归调用的F#System.OutOfMemoryException

这实际上是F#中Project Euler Problem 14的解决方案.但是,在尝试计算较大数字的迭代序列时,我遇到了System.OutOfMemory异常.正如您所看到的,我正在编写带尾调用的递归函数.

我遇到了StackOverFlowException的问题,因为我在visual studio中调试(禁用尾调用).我在另一个问题中记录了这一点.在这里,我正在以发布模式运行 - 但是当我将其作为控制台应用程序(在带有4gb ram的windows xp上)运行时,我的内存不足.

我真的很难理解我是如何编码自己进入内存溢出的,并希望有人能以我的方式显示我的错误.

let E14_interativeSequence x =

  let rec calc acc startNum =
    match startNum with
    | d when d = 1      -> List.rev (d::acc)
    | e when e%2 = 0    -> calc (e::acc) (e/2)
    | _                 -> calc (startNum::acc) (startNum * 3 + 1)

  let maxNum pl=

    let rec maxPairInternal acc pairList =
        match pairList with
        | []        ->  acc
        | x::xs     ->  if (snd x) > (snd …
Run Code Online (Sandbox Code Playgroud)

recursion f# tail-recursion out-of-memory

2
推荐指数
1
解决办法
587
查看次数

F#'+'运算符重载和List.fold

我正在尝试在定义运算符重载的记录类型上使用List.fold +,但是当尝试使用(+)运算符作为lambda传递给fold 时,我遇到类型不匹配错误.这是一个简化的代码片段,它举例说明了我的问题:

// a record type that also includes an overload for '+'
type Person = 
    { Name : string; Age: int }
    static member ( + ) (x: Person, y: Person) = x.Age + y.Age
Run Code Online (Sandbox Code Playgroud)

+超负荷的工作就好了

> jen + kevin;;
val it : int = 87
Run Code Online (Sandbox Code Playgroud)

但是说我有个人名单:

> let people = [kevin;jen];;
Run Code Online (Sandbox Code Playgroud)

我不能使用List.fold来总结所有年龄段:

> List.fold (+) 0 people;;

List.fold (+) 0 people;;
----------------^^^^^^

error FS0001: Type constraint mismatch. The type 
    int    
is not …
Run Code Online (Sandbox Code Playgroud)

f# overloading record fold operator-keyword

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

使用JQuery更改img src但保留路径信息完好无损?

我正在使用JQuery来切换出一个图像src:

$("#myImg").attr("src", "../../new.gif");
Run Code Online (Sandbox Code Playgroud)

注意新src上的相对路径.不幸的是,当我部署我的应用程序时,这不可移植.在我的MVC应用程序中,我使用的是ResolveUrl()方法,它将为我修复路径问题,因此它是可移植的,但现在我的JQuery图像src交换器无法正常工作,因为它现在将正确解析的路径切换为损坏的相对路径.

<img id="myImg" src="<%=ResolveUrl("~/Images/transparent.gif")%>" />
Run Code Online (Sandbox Code Playgroud)

我想要的是JQuery只需翻转实际文件名并保持路径不变.我的第一个想法是

// pseudocode javascript jquery on my thought on how to approach this prob
var oldFullPath = $('#myImg").GetTheImgSrc;
var newFileNameWithPathIntact = someRegexAddNewFileNameWithOldPath
$("#myImg").attr("src", newFileNameWithPathIntact);
Run Code Online (Sandbox Code Playgroud)

但这对我来说似乎相当严重而且非JQuery.谁有更好的方法?

javascript model-view-controller jquery

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