Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 具有添加、更新和删除功能的selenium测试的最佳实践_C#_Testing_Selenium_Nunit_Mstest - Fatal编程技术网

C# 具有添加、更新和删除功能的selenium测试的最佳实践

C# 具有添加、更新和删除功能的selenium测试的最佳实践,c#,testing,selenium,nunit,mstest,C#,Testing,Selenium,Nunit,Mstest,我刚刚开始使用MSTests为我的asp.net应用程序编写selenium测试(我使用了NUnit,但我没有看到它和ms之间的任何区别…),到目前为止,我很喜欢它们,除了测试随机启动的部分 现在我得到的部分是,测试不应该依赖于其他测试(!!!),但是如果您的测试随机启动,并且它们彼此不依赖,您将如何测试添加、更新、删除功能 我只能看到两种编写此类测试的方法: 使用OrderedTests,这是我不喜欢的 写一个大的测试,做所有这些事情,但我有一个测试,做3件事 编辑:我忘了提我不嘲笑。我希望我

我刚刚开始使用MSTests为我的asp.net应用程序编写selenium测试(我使用了NUnit,但我没有看到它和ms之间的任何区别…),到目前为止,我很喜欢它们,除了测试随机启动的部分

现在我得到的部分是,测试不应该依赖于其他测试(!!!),但是如果您的测试随机启动,并且它们彼此不依赖,您将如何测试添加、更新、删除功能

我只能看到两种编写此类测试的方法:

  • 使用OrderedTests,这是我不喜欢的
  • 写一个大的测试,做所有这些事情,但我有一个测试,做3件事
    编辑:我忘了提我不嘲笑。我希望我的测试与我的测试数据库一起工作。

    有序测试不是一个好主意,因为在多核处理器中,我们可以同时运行多个测试。这在构建服务器的情况下非常有用,并有助于快速高效地运行测试。有序的测试用例无论如何都会失败,这不是一个好主意

    选项2是首选方法,但我不会称之为“大”。因为除了要测试的类/功能之外,还应该对其进行模拟。如果你是在嘲笑他们,并且写得很好,他们只会被包含

  • 启用/产生测试条件
  • 断言逻辑
  • 我的意思是,如果所有依赖关系都被正确模拟,那么每个测试用例都将很小,并且可以在半秒钟内执行

    简而言之,单元测试将由3部分组成,它们应该相互独立

  • 将进入初始化/模拟的常见内容
  • 每个测试用例开始时的测试方法特定条件
  • 断言
  • 编辑

    我很抱歉地说,如果您使用的是测试数据库,那么它就违背了单元测试的目的。单元测试是无状态的,应该是模块化的。您应该能够只测试应用程序功能的一小部分,而不依赖于其他模块。您应该与应用程序逻辑分开测试DAL层/数据库访问代码。数据库是有状态的,如果您将单元测试与数据库联系起来,那么您将集成两个不同的组件,并使其成为一种集成测试,这将使执行变得越来越长,从长远来看,这可能是一个问题


    现在,你可以继续选择2。但是,如果您想要一个更好的单元测试套件,您仍然需要考虑使用mock,并将对数据库的依赖从单元测试中分离出来,这在将来将是一个问题。您仍然可以做的是,您可以在更高的级别编写集成测试,使20%单独用于集成,其余80%集中于单元测试。通过这种方式,您将得到覆盖大多数功能的更快的测试用例,并且更易于维护。您可以在剩下的20%上做出妥协,这是更大的集成测试,维护成本更高

    我知道这违背了一般惯例,但我发现在测试的默认顺序方面存在依赖关系没有什么问题

    在现实世界中,如果您正在进行端到端测试,用例几乎总是遵循添加->编辑->删除的顺序。用户可能至少有90%的时间会经历此用户旅程。我发现以同样的方式自动化测试以覆盖这些可能性没有问题


    另一种选择是用足够的对象填充数据库,以便测试可以彼此独立运行。

    测试不应该依赖于其他测试,它们应该是独立的。最重要的原因是测试线束的稳定性,以及测试失败时您应该/将如何反应。您不想开始调试以发现“更新”测试失败是因为其他测试失败了

    就像@Phil建议的那样,这个数据库可能是一个前进的方向。当然,这也可能是错误的根源

    另一种方法是为测试代码提供“管理”方法/端点,例如,可以创建帐户(或系统处理的资源),并使它们处于实际测试的正确状态。当然,还有一些“管理”功能也会导致错误


    良好稳定的硒测试并不容易。祝你好运

    在测试数据库项目时,我发现以下几点是有效的:

    • 每个测试都有一个设置。类似的测试可以共享此功能,但每个测试都应该为所创建的数据具有唯一的标识符。因此,对于TestBalanceShopCashUp,创建一个名为BalanceShopCashUp、BalanceShopCashupUptill01、BalanceShopCashupUptill02等的商店
    • 具有传递唯一标识符的通用拆卸,该标识符删除所有测试数据。无论测试成功与否,都会在每个测试结束时运行此操作。我的数据库中有几个存储过程来执行此操作。它们还删除引用我的已标识数据的数据
    • 使用调试器中的断点等工具检查关键点的程序状态,使用SQL Server Profiler检查传递到数据库的值
    • 我总是在与数据库交互时使用存储过程。没有直接绑定到输入字段

    我有点忘了提到我不使用mock。我有一个单独的数据库用于测试,我希望我的测试能够与真实的数据库一起工作。我认为填充数据库的想法是行不通的。假设我有一个音乐商店web应用程序,我想添加一张cd,编辑它,然后删除它。如果我的测试是随机触发的,我必须在每个测试中放入随机数据(以防更新前触发删除)。但是随机数据测试并不好,因为你不能轻易地重新创建它们。我遗漏了什么吗?正如Jocke评论中提到的,我没有用数据填充数据库的想法。我不能在测试中使用静态数据(例如