【问题标题】:How to implement integration testing for IdentityServer4? [closed]如何实现 IdentityServer4 的集成测试? [关闭]
【发布时间】:2018-05-08 11:27:35
【问题描述】:

这更像是一个一般性的问题,而不是一个具体的问题,但我希望它可以帮助将来遇到类似问题的人。

我正在为我的业务案例实施 IdentityServer4,我最初想为公共 API 访问设置身份验证和授权。为此,我最初将仅使用 ClientCredentials 流。为了手动测试使用流程以及正确的配置和设置,我创建了一个小型测试 API 和一个客户端控制台应用程序,就像文档中的示例项目一样。但我想自动化它,因为我几乎完成了 IdentityServer4 的设置,并且将开始处理实际的 API 本身。

所以基本上我想对我的 IdentityServer 实现进行一些集成测试。但我对这个主题的经验很少,所以也许你会对如何设置它有一些建议或提示。

当至少一些端点已经完成时,我是否应该在 API 端进行设置?但是,如果我的 IdentityServer 和 API 在不同的解决方案中,例如为了在本地运行这些测试,我仍然必须手动启动 IdentityServer,然后才能在连接它的 API 项目上运行测试?

或者对我来说,在 IdentityServer 项目中进行测试、测试 api 和客户端会更有意义(与在源代码解决方案中完成的方式非常相似)。但是在查看源代码集成测试时,我看到他们有一个单独的用于 IdentityServer 启动的 Startup 类。我应该以类似的方式执行此操作,还是将测试配置为针对我自己的 IdentityServer 项目的 Startup 类运行?然后我必须复制所有 appSettings 文件等。

我知道这是一个相当笼统的问题和主题,但任何关于如何实际测试正确事物的指针都将不胜感激。我知道我不需要对功能本身进行很多测试,因为它也在源代码解决方案中完成,但我宁愿进行集成测试来测试我自己的配置等,所以如果任何组件无法与彼此,我会立即知道的。

提前致谢!

【问题讨论】:

    标签: testing asp.net-core integration-testing identityserver4 asp.net-core-2.0


    【解决方案1】:

    我基本同意你的想法。

    在我开始我的 IdentityServer 项目之前,我曾问过一个问题 here on StackOverflow。 @Lutando 回答了这个问题,四个用户对此表示赞同(尽管没有人喜欢 :( 这个问题)。无论如何,我们为我们的项目添加了一些验收和集成测试。您可以查看this thread 以了解有关如何写这样的测试

    或者对我来说,拥有测试、测试 api 和 IdentityServer 项目中的客户端(与它的完成方式大致相同 在源代码解决方案中)。但是在查看源代码时 集成测试,我看到他们有一个单独的 Startup 类 身份服务器启动。我应该这样做还是配置 针对我自己的 IdentityServer 的 Startup 类运行的测试 项目?

    我可以告诉我们公司是如何处理这件事的(不是每个人都喜欢这个想法)。由于我们的身份服务器将只处理混合流(仅授权 mvc 应用程序、win 应用程序和 rest api),我们创建了一些示例项目(每个项目用于一种)并通过TestsServer 运行它们。我们在 IdentityServer 的 Startup 类上有一些虚拟方法,以便我们可以播种数据并连接到内存数据库。 每个测试都会在内存中创建自己的数据库

    无论如何,这些测试都非常优雅地完成了它们的工作。使用管理接口实现 IdentityServer 花了 7 个月的时间,而且很多时候我们都指出了错误的实现。 这些测试通常是值得的

    最后,我想指出我在开发 IdS4 时发现的几件事

    • 集成测试需要很长时间,所以不要重复相同类型的测试。
    • 正如您在问题中提到的,IdentityServer4 源已经正确测试了他们的代码,因此无需测试 identityServer4 的工作方式。只需测试成功的连接部分。
    • 很难用 access_token 或 identityToken 测试断言
    • 使用 browser client 处理重定向和 cookie
    • 最后,以这种方式编写集成测试既困难又耗时。我认为我们应该为项目之间交互的基本功能添加足够的测试

    但是,如果您熟悉 Selenium/Coded UI 或类似工具,最好使用这些工具编写集成测试。我相信,编写少量验收测试(或服务级别测试)只是为了确认新代码不会破坏工作流程是更好的方法

    最后,我想添加一些验收测试,我们发现这些测试可以节省我们的时间

    1. 从 MVC 客户端登录
    2. 从客户端登录并从 mvc 客户端调用 api
    3. 根据设置显示或不显示同意页面
    4. 从控制台应用调用 API
    5. 由于范围不足,API 调用失败
    6. 用户声明添加成功 ...

    我们拥有的集成测试数量为 22

    如果我在这里提到的任何内容不正确,请随时纠正我。

    祝您的 IdentityServer4 实现好运

    【讨论】:

    • 感谢您如此详尽的回答!我知道这个问题非常笼统和广泛,但这些一般性建议正是我想要的。我想如果能够在某个时候私下与您联系,我会受益匪浅。但是关于你的回答,我也是从基于源项目的 DiscoveryClient 测试开始的。我在您共享的链接的答案中有相同的 4 行,但我想知道您为 WebHostBuilder 提供了哪个启动文件?我同意你的大部分观点,但我还不会碰 Selenium。另外,您是否开发了自己的管理 UI?
    • 覆盖测试启动传递给 WebHostBuilder。是的,我们开发了一个小型 AdminUI
    • 所以就像他们在源项目中拥有它一样? IntegrationTests 项目中有一个新的单独的 Startup 类?但是我很难理解它是如何测试与我的 IdS4 实际实现的集成的?目前,我在 Test 项目中为 Clients 和 Resources 创建了新类。对我来说,我正在测试正确的东西的唯一方法就是拥有与我的实际实现完全相同的 Client 和 Resource 对象。否则,它只是一个单独的实现,仅用于测试,并不能保证我的真正实现有效。
    • 想想数据库,或用于测试的种子数据,或测试中间件。你不需要测试已经测试过很多次的东西。
    • 是的,当然,我不想复制已经在 IdS4 源项目中完成的测试。但我想测试我的生产应用程序。我已经配置了 ApiResources 和 Clients,我想测试它是否正确完成。我想要一个受 IdS4 保护的测试 API 和一个尝试使用该 API 的测试客户端。例如,HTTPS 已为 AWS 中的 IdS4 正确配置。但是基于 IdS4 源代码中的集成测试,测试项目中有一个覆盖的测试启动 + 用于客户端和资源的种子数据。所以它就像一个单独的配置,不一样。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-15
    • 1970-01-01
    • 2021-12-21
    • 2011-06-23
    • 2016-04-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多