关于在单元测试中描述构成“单元”的最佳方法的争论经常很多。 考虑测试范围是代码结构的重要组成部分,是对实现方式进行分组的补充。
结构是软件的一个方面,也必须具有依赖性。 即使通过合同(例如,API,接口类型)进行了说明或被反转(例如,插件,依赖性注入),依赖性仍然存在。 但是,诸如此类的实施实践可能有助于改善测试范围和隔离性。
特别是在测试时,范围和隔离性问题会导致测试设置繁多(例如,模拟)以及实现的更改位置和受这些更改影响的测试之间的差异。
Eunice旨在通过更广泛的结构和依赖关系概念将范围和隔离的概念结合在一起。 它通过鼓励单向依赖而不是双向来做到这一点。 这包括间接依赖性。
![](https://i-blog.csdnimg.cn/blog_migrate/09c03046e2b313fd4af602fda20a464f.png)
这篇文章是对早期案例研究的第二篇后续文章,该案例研究通过在JavaScript库React的源代码上使用Eunice来调查和演示Eunice的功能:
深入研究React体系结构:结构和依赖关系(壮举Eunice)
将代码与Eunice分组[解释]
在React中,最重要的结构范围似乎是其存储库根目录中的packages目录 。 在案例研究结束和第一个后续研究中,在查看了Eunice显示的依赖关系之后,我为packages目录定义了一个潜在的堆栈,其中包括一个新的devtools组。 在软件包作用域(灰色子目录框外面的箭头),仍然存在一些不匹配的依赖项(红色箭头):
![](https://i-blog.csdnimg.cn/blog_migrate/492f2555ea9972c043a277abf0c89a5b.png)
在查看React的代码时,我注意到某些包范围的双向依赖项仅在其测试中。 可以通过修改忽略路径模式以排除与测试相关的目录来进行调查:
npx eunice \
--ignore-path-pattern= "(^(\.|babel.config.js|scripts|fixtures)|node_modules|__tests__)" \
--modify-stacks-file=.eunice-stack-modify.yaml \
--babel-parser-plugins=classPrivateProperties \
--babel-parser-plugins=classProperties \
--babel-parser-plugins=dynamicImport \
--babel-parser-plugins=flow \
--babel-parser-plugins=jsx
重新运行分析并重新加载网页表明,在忽略测试的情况下,包范围内没有双向依赖项的子目录数量得到了改善。 请注意,Eunice已检测到react-test-renderer不再需要堆叠在单独的级别中,因此它已自动将其移至上面的级别:
![](https://i-blog.csdnimg.cn/blog_migrate/edaec87d99417785e5cff797b8e26acb.png)
程序包中其余的红色不匹配依赖项箭头来自react-flight和react-server到react-dom。 第一次修改包目录堆栈可以单向获得所有包作用域的依赖项。 这可以通过将react-flight和react-server移到react-dom之下来完成:
- - existing
- - id: react-devtools-group
dependencyPermeable: true
items:
- [ react-devtools, react-devtools-shell ]
- [ react-devtools-core, react-devtools-inline ]
- - react-devtools-extensions
- - react-devtools-shared
- [ react-art, react-interactions, react-refresh ]
- - react-test-renderer
- [ react-dom, react-native-renderer, react-noop-renderer ]
- [ legacy-events, react-flight, react-reconciler, react-server ]
- [ create-subscription, jest-mock-scheduler, jest-react, react-cache, react-is, react-stream, use-subscription ]
- [ babel-plugin-react-jsx, eslint-plugin-react-hooks, react, react-debug-tools, scheduler, shared ]
现在我们可以在Eunice中看到,包子目录中唯一的依赖项是来自测试的依赖项,因为没有包范围的不匹配红色箭头:
![](https://i-blog.csdnimg.cn/blog_migrate/dee2d4fa314aa11ce72228c65511964f.png)
忽略Eunice中的测试已经显示了可能对实现有用的单向结构。 但是,理想情况下并且更永久地来说,可以在React的代码中更新测试以匹配这种结构,因此在分析中表示的重要性与实现的重要性相同。
在https://devsnicket.com/eunice上找到更多信息
( 披露 : 作者是Eunice的创作者 )
From: https://hackernoon.com/test-scope-and-isolation-with-eunice-vu1a33h4