Discussion: Test generator design
@mk-mxp 已经在做这个了。
开始于 2025年10月5日。
评估
这个 Issue 还没有评估数据。
描述
To keep away lengthy discussions from tracking issue #631 / pull requests #674 and #663
There are lots of experiences and information about the test generators of various tracks in the forum discussion started by Cool-Katt for the JS track test generator.
My conclusion based on the information gathered there is: It takes 2 test generators. Or at least 2 largely different approaches (commands) with a small overlapping code base.
- First time creation of test code "from scratch"
- Production-ready test code creation for updates
This is my sketchy design for those two for discussion:
"from scratch"
- Identify the most likely kind of test case to support
- I think it is "single function call with arguments, assert on return value"
- We wrap those functions into classes making them method calls
- Class instantiation happens without arguments
- Identify the data structure variations around test cases to support
- This overlaps with "for updates", but there are differences
- There is documentation in problem spec
- I think there are
- The outermost object
CanonicalData- required
- An array of
Itemobjects I calledInnerGroup- There are instances of
GroupandTestCasein the same array (anyOf, notoneOfin JSON schema terms) - required
- There are instances of
- A recursively occuring
Group implements Itemobject with anInnerGroupand additional data- 0 - 3 nesting levels discovered so far
- required
- A
TestCase implements Itemobject with variations like "single function call with arguments, assert on return value", "error", "multiple function calls with arguments, assert on state / return value"- Support only "single function call with arguments, assert on return value" and "error"
- The outermost object
- The structure also contains
scenariosas a virtual grouping- ignored
TestCases use fieldreimplementsfor test case replacement- ignored
tests.toml(or another source of information) used for ignoring test cases is ignored, as there cannot be information in it about the new exercise
- Implement a parser to enable a simple "one fits all" template
- Extract the data required to render the structure to support
- Extract the data required to render the test cases to support
- Provide any other data to render into comments for the contributor to design the exercise
- Implement a "one fits all" template
- This template will rarely change
- Use a technique every contributor should know well
- Test it well with all variations in structure, no data shall be lost
"for updates"
- Identify all kinds of test cases to support
- I think this will be done incrementally
- There must be extensibility for the templating engine (maybe per exercise?)
- We already have students interfaces which add to the required "kinds of test cases" (i.e.
allergies)
- Identify the data structure variations around test cases to support
- This overlaps with "from scratch", but there are differences
- There is documentation in problem spec
- I think there are
- The outermost object
CanonicalData- required
- An array of
Itemobjects I calledInnerGroup- There are instances of
GroupandTestCasein the same array (anyOf, notoneOfin JSON schema terms) - required
- There are instances of
- A recursively occuring
Group implements Itemobject with anInnerGroupand additional data- 0 - 3 nesting levels discovered so far
- required
- A
TestCase implements Itemobject with variations- "single function call with arguments, assert on return value"
- "error"
- "multiple function calls with arguments, assert on state / return value"
- All must be supported, maybe per exercise
- The outermost object
- The structure also contains
scenariosas a virtual grouping- May be ignored if
tests.toml(or another source of information) is used for ignoring test cases - Must be supported if no test cases with
scenarioshall be rendered accidentally
- May be ignored if
TestCases use fieldreimplementsfor test case replacement- Must support replacement
- There are different strategies like "replace always", "replace when forced to", "use
tests.tomlto ignore replaced test cases" (works like a baseline for known test issues)
- Implement a parser to enable a "per exercise" template
- Extract the data required to render the structure to support
- Extract the data required to render the test cases to support
- Warn about or silently drop any other data (commandline flag for this?)
- Implement the "per exercise" templates
- There could be a library of template variations to select from
- These templates will change whenever the data contains new things to support (like adding "error" test cases when there were none before)
- Use a technique every contributor should know well
- It is developed by comparison to the original test code, there should not be tests per exercise but for the possible template variations
- 主要语言
- PHP
- 星标
- 167
- 派生
- 150
- 平均合并
- 22 小时 18 分钟
- 30 天内合并 PR
- 7
环境准备
在浏览器里用你自己的 GitHub 账号启动这个项目的开发容器。
- 没有 Dockerfile 或 Docker Compose 文件
- 没有 Pull Request 模板
- 没有贡献指南
从这里开始
- 先读完整个 Issue,再读项目的贡献指南。
- 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
- Fork 仓库,在一个分支上完成修改。
- 提交 Pull Request,并在描述里引用这个 Issue 编号。
exercism/php 的其他 Issue
-
难度 5/5 一周以上 新手友好度 20/100
-
难度 5/5 一周以上 新手友好度 25/100
-
难度 4/5 3-5 天 新手友好度 35/100
-
难度 5/5 一周以上 新手友好度 20/100
-
Tracking: Test generator MVP可能重新可做 @mk-mxp 于 965 天前认领,目前没有进行中的 PR。 未关闭
相似的 Issue
-
难度 2/5 半天 新手友好度 68/100
components-web-app/docs#244 ·
-
难度 2/5 1-3 小时 新手友好度 78/100
nhrrob/nhrrob-secure#22 ·
-
难度 2/5 1-3 小时 新手友好度 70/100
PrestaShopCorp/ps_eventbus#501 · 2 个 reaction ·
-
category::task maintenance priority::normal
难度 2/5 1-3 小时 新手友好度 62/100
e0ipso/schema-forms-php#58 ·
-
难度 2/5 1-3 小时 新手友好度 66/100
Automattic/blocks-engine#2866 ·
维护者通常 1 天内回复