代码之家  ›  专栏  ›  技术社区  ›  RodH257

net与nhibernate的集成测试

  •  2
  • RodH257  · 技术社区  · 15 年前

    我的项目背景:

    • ASP.Net前端-
    • 用于与SQL Server 2008 express进行数据库交互的NHibernate-
    • Teamcity CI服务器运行NAnt构建脚本。

    我现在处于一个“alpha”版本中,发现所有的bug都是集成bug,主要是因为我的集成测试是手动使用站点,以及一些小的自动化的东西(我已经停止运行了)。考虑到我对测试套件的严格培养,这是相当糟糕的,我想纠正它。

    所以我需要一些关于集成测试的提示

    • 测试数据,我发现'NDBUnit'是我应该用来让我的数据处于良好状态的东西吗?它和NHibernate兼容吗?
    • 如何使这些测试保持可维护性?我做了一些集成测试,但它们给我带来了麻烦,我发现自己在回避它们。我想这主要是因为我每次都没有设定一个一致的状态。

    3 回复  |  直到 15 年前
        1
  •  2
  •   Will L Alex Vazhev    12 年前


    -您可以直接按照本文的思路使用它: Unit testing with built-in NHibernate support .

    -SQLite并不支持SQL Server提供的所有功能。 This article
    -NDbUnit作为一种准备测试数据的机制也是一个不错的选择—只要您不希望频繁地更改数据库中的模式(在这种情况下,维护所有相关的xml文件将是一项相当大的工作……)。
    关于ASP.NET部件:
    -你可能会找到一个像 Selenium

    啊!
    托马斯

        2
  •  0
  •   Jeff    11 年前

    派对有点晚了,但这是我已经做了一段时间了。

    我正在编写restapi,它将被我们的移动应用程序使用。这些移动应用程序也是用C编写的,所以编写API包装器(SDK)对我来说是有意义的。

    集成测试时,我设置测试用例来测试API的所有端点, 使用SDK . 当运行测试时,API在本地IIS上以开发模式运行。每次启动服务器时,我的dev数据库都会被擦除、重新创建,并且 以所有表的数据为种子

    在测试我的存储库时,重要的是要知道我的查询是否可以被NHibernate翻译,所以我所有的存储库测试都使用LocalDB,它是重新创建的 对于每个测试用例

    另一件事,当你的数据库种子与现实的数据,你也得到你的外键设置免费测试。而且,播种机正在使用你的域类,所以看起来也不错!

    播种机示例:

    public void Seed(ISession s) 
    {
      using(var tx = s.BeginTransaction() 
      {
        var account1 = new Account { FirstName = "Bob", LastName = "Smith" };
        var account2 = new Account { FirstName = "John", LastName = "Doe" };
        account1.AddFriend(account2); // manipulates a friends collection
        s.Save(account1);
      }
    }
    

    您应该在创建会话工厂时调用seeder。

        3
  •  -3
  •   Community Mohan Dere    9 年前

    简单的回答是:不要做集成测试。

    我们有以下设置:

    • 为业务代码的每个功能编写一个单元测试;

    • 确保这些测试涵盖所有内容。

    我们确实有集成测试,但这些测试都写在Word文档中,而且通常只是原始的规范。QA人员在代码交付时运行这些代码,大多数情况下它都能正常工作,因为我们已经测试了每一个小部分。

    Integration Tests Are a Scam .

    repository pattern

    public class NhRepository<T> : IRepository<T>
    {
        public T Get(int id)
        {
            return GetSession().Get<T>(id);
        }
    }
    
    public interface IUserRepository : IRepository<User>
    {
        IEnumerable<User> GetActiveUsers();
    }
    
    public class UserRepository : NhRepository<User>, IUserRepository
    {
        public IEnumerable<User> GetActiveUsers()
        {
            return
                from user in GetSession().Users
                where user.IsActive
                return user;
        }
    }
    

    这个和 Windsor IoC容器提供我们的数据访问。这种设置的原因是:

    1. 这些查询非常简单(98%都是这样),而且我们没有对它们进行彻底的测试。这听起来可能很奇怪,但我们倾向于使用同行评议比任何其他机制来测试这些机制;

    2. var repositoryMock = mocks.StrictMock<IUserRepository>();
      
      var activeUsers = new List<User>();
      
      for (int i = 0; i < 10; i++)
      {
          var user = UserMocks.CreateUser();
          user.IsActive = true;
          activeUsers.Add(user);
      }
      
      Expect.Call(repositoryMock.GetActiveUsers()).Return(activeUsers);
      

      实际的代码要简洁得多,但是你明白了。