You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Daml中模拟随机选择?测试场景实现方法咨询

在Daml测试场景中模拟随机选择的实现方案

你的理解完全正确——Daml合约逻辑本身是确定性的,必须依赖外部Oracle引入非确定性,但测试场景确实可以在本地模拟随机选择,无需依赖外部服务。以下是几个可行的实现方向:

  • 利用Daml Script/Scala测试的原生随机API
    Daml的测试环境(包括Daml Script和Scala测试套件)可以直接调用Java/Scala的随机工具类。比如实现一个随机选择列表元素的函数:

    import scala.util.Random
    
    // 定义随机选择函数
    def randomPick[A](list: List[A]): A = list(Random.nextInt(list.length))
    
    // 在Daml Script中调用
    script do
      let options = ["Option1", "Option2", "Option3"]
      picked <- liftIO $ randomPick(options)
      debug $ "随机选中: " <> picked
    
  • 构建测试专用的模拟Oracle
    如果需要在合约逻辑测试中模拟Oracle的随机输入,可以编写测试专属的辅助逻辑:预先生成随机值,再将其作为参数传递给合约的选择逻辑,以此模拟Oracle返回的随机索引。这种方式能让你在测试中复现实线上依赖Oracle的场景。

  • 在Scenario测试中使用可控随机
    编写Daml Scenario测试时,建议使用带固定种子的随机生成器,保证测试结果可复现:

    scenario do
      let options = ["A", "B", "C"]
          rng = Random.mkStdGen 123 // 固定种子确保每次测试结果一致
          (randomIndex, _) = Random.nextInt (length options) rng
          selectedOption = options !! randomIndex
      debug $ "测试随机选中: " <> selectedOption
    

注意:测试中的随机逻辑务必保持可控,设置固定种子是关键——避免因随机值变化导致测试用例结果不稳定,方便后续排查问题。

内容的提问来源于stack exchange,提问作者claudia giannoni

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 15:53:15