gpt4 book ai didi

asp.net - Nunit 和 Web 应用程序

转载 作者:行者123 更新时间:2023-11-28 20:33:41 24 4
gpt4 key购买 nike

我开始使用“(NUnit)”学习单元测试。我知道这种类型的测试用于测试“类”、“函数”和“这些函数之间的交互”。

在我的案例中,我开发了“asp.net web 应用程序”。

  • 我如何使用此测试来测试我的页面(因为它被认为是一个类以及使用的方法)和顺序是什么?,我有三层:

    1. 界面层(每个页面的.cs)。

    2. 数据访问层(每个实体的类)(DAL)。

    3. 数据库层(包含与数据库的连接、打开连接、关闭连接等)。

    4. 业务层(有时做计算或一些单独的逻辑)。

  • 如何测试连接数据库的方法?

  • 如何确保我的测试不会浪费时间?

最佳答案

有单元测试和集成测试。单元测试正在测试单个组件/类/方法/函数以及它们之间的交互,但只有一个真实对象(被测系统-SUT)和测试替身。测试替身可以分为 stub 和模拟。 stub 向 SUT 提供准备好的测试数据。这样您就可以将 SUT 与环境隔离开来。因此,您不必点击数据库、Web 或 wcf 服务等,并且每次都有相同的输入数据。模拟用于验证 SUT 是否按预期工作。 SUT 在模拟对象上调用方法,甚至不知道它不是真实对象。然后您通过在模拟对象上断言来验证 SUT 是否有效。您可以手动编写 stub 和模拟或使用许多模拟框架之一。其中之一是 http://code.google.com/p/moq/

如果您想测试与数据库的交互,那就是集成测试,而且通常要困难得多。对于集成测试,您必须以众所周知的状态设置外部资源。

让我们把你的图层:

  1. 您将无法对其进行单元测试。页面与 ASP.NET 运行时紧密耦合。你应该尽量不要在代码后面有太多代码。只需从您的代码后面调用一些对象并测试这些对象。你可以看看 MVC 设计模式。如果你必须测试你的页面你应该看看http://watin.org/ .它会自动执行您的互联网浏览器、点击页面上的按钮并验证页面是否显示预期结果。

  2. 这是集成测试。您将数据放入数据库,然后读回并比较结果。测试后或测试前您必须将测试数据库置于众所周知的状态,以便测试可重复。我的建议是在测试运行之前而不是在测试运行之后设置数据库。这样您就可以在测试失败后检查数据库中的内容。

  3. 我真的不知道这与第 1 点有何不同。 2.

  4. 这是单元测试。在测试中创建对象,调用它的方法并验证结果。

第 2 点介绍了如何测试连接到数据库的方法。如何不浪费时间?这将随着经验而来。除了不要测试没有任何逻辑的属性之外,我没有一般性建议。

有关单元测试的重要信息,请查看此处:

http://artofunittesting.com/

http://www.amazon.com/Test-Driven-Development-Kent-Beck/dp/0321146530

http://www.amazon.com/Growing-Object-Oriented-Software-Guided-Tests/dp/0321503627/ref=sr_1_2?ie=UTF8&s=books&qid=1306787051&sr=1-2

http://www.amazon.com/xUnit-Test-Patterns-Refactoring-Code/dp/0131495054/ref=sr_1_1?ie=UTF8&s=books&qid=1306787051&sr=1-1

编辑:

SUT、CUT - 被测系统或类。那就是你测试的。测试 double - 来自特技 double 。他们在电影中制作危险场景,这样真正的 Actor 就不必这样做了。同样在这里。测试替身替换测试中的真实对象,以便您可以将测试中的 SUT/CUT 与环境隔离。

让我们看看这个类


public class NotTestableParty
{
public bool ShouldStartPreparing()
{
if (DateTime.Now.Date == new DateTime(2011, 12, 31))
{
Console.WriteLine("Prepare for party!");
return true;
}
Console.WriteLine("Party is not today");
return false;
}
}

您将如何测试这个类(class)在新年前夜做了它应该做的事情?你必须在新年前夕做:)

现在看修改后的Party类 stub 示例:

    public class Party
{
private IClock clock;

public Party(IClock clock)
{
this.clock = clock;
}

public bool ShouldStartPreparing()
{
if (clock.IsNewYearsEve())
{
Console.WriteLine("Prepare for party!");
return true;
}
Console.WriteLine("Party is not today");
return false;
}
}

public interface IClock
{
bool IsNewYearsEve();
}

public class AlwaysNewYearsEveClock : IClock
{
public bool IsNewYearsEve()
{
return true;
}
}

现在在测试中你可以将假时钟传递给 Party 类

        var party = new Party(new AlwaysNewYearsEveClock());
Assert.That(party.ShouldStartPreparing(), Is.True);

现在您知道您的派对类是否在新年前夜上课了。 AlwaysNewYearsEveClock 是一个 stub 。

现在看看这个类:

    public class UntestableCalculator
{
private Logger log = new Logger();

public decimal Divide(decimal x, decimal y)
{
if (y == 0m)
{
log.Log("Don't divide by 0");
}

return x / y;
}
}

public class Logger
{
public void Log(string message)
{
// .. do some logging
}
}

您将如何测试您的类(class)记录消息。取决于你记录它的位置你必须检查文件或数据库或其他地方。那不是单元测试而是集成测试。为了单元测试你这样做。

    public class TestableCalculator
{
private ILogger log;
public TestableCalculator(ILogger logger)
{
log = logger;
}
public decimal Divide(decimal x, decimal y)
{
if (y == 0m)
{
log.Log("Don't divide by 0");
}
return x / y;
}
}

public interface ILogger
{
void Log(string message);
}
public class FakeLogger : ILogger
{
public string LastLoggedMessage;
public void Log(string message)
{
LastLoggedMessage = message;
}
}

在测试中你可以

var logger = new FakeLogger();
var calculator = new TestableCalculator(logger);
try
{
calculator.Divide(10, 0);
}
catch (DivideByZeroException ex)
{
Assert.That(logger.LastLoggedMessage, Is.EqualTo("Don't divide by 0"));
}

在这里你断言假记录器。假记录器是模拟对象。

关于asp.net - Nunit 和 Web 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6175400/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com