Testing 如何在编写代码时测试代码/输出的可靠性?

Testing 如何在编写代码时测试代码/输出的可靠性?,testing,methods,ide,solidity,Testing,Methods,Ide,Solidity,我意识到这是一个非常初级的问题,所以请容忍我。我最近开始了我在Solidity中的第一个项目,这是因为我完全使用Python。在使用Python时,我不断地注入print语句来检查我的工作输出,并确保一切都按计划进行 我很难以稳定的方式复制相同的工作流。即使在IDE前端,我也将PyCharm与Python结合使用,Python有一个运行命令和输出窗口,但我找不到任何可与之媲美的稳定性。我使用的是Sublime文本,但这似乎只适合于编写实际代码,而且我找不到一种方法来调用函数/映射等到窗口以检查输

我意识到这是一个非常初级的问题,所以请容忍我。我最近开始了我在Solidity中的第一个项目,这是因为我完全使用Python。在使用Python时,我不断地注入print语句来检查我的工作输出,并确保一切都按计划进行

我很难以稳定的方式复制相同的工作流。即使在IDE前端,我也将PyCharm与Python结合使用,Python有一个运行命令和输出窗口,但我找不到任何可与之媲美的稳定性。我使用的是Sublime文本,但这似乎只适合于编写实际代码,而且我找不到一种方法来调用函数/映射等到窗口以检查输出

Remix的功能比大多数都多,但我更喜欢本地开发环境。我已经找了一段时间了,我觉得我找错了地方,不知道为什么这个看似简单的问题很难找到答案。任何洞察都会令人惊讶


谢谢

Solidity没有显示调试值的命令行输出。这可以说服您编写更简单的函数,遵循该原则并分别测试其输入/输出

因此,与其编写一个长函数来完成所有任务,还不如在执行过程中很难知道发生了什么

function transfer(uint256 _tokenId) external {
    require(msg.sender == ownerOf(_tokenId)
        || isApprovedForAll(ownerOf(_tokenId), msg.sender)
        || msg.sender == getApproved(_tokenId), 'Sender not allowed');

    if (approved != address(0x0)) {
        tokenApprovals[_tokenId] = address(0x0);
        emit Approval(_tokenOwner, address(0x0), _tokenId);
    }

    // ... etc
}
您可以将功能分解为更小的部分(更易于单独测试)。如果需要,您可以在一个函数中连接它们

function transfer(uint256 _tokenId) {
    address tokenOwner = ownerOf(_tokenId);
    address approved = getApproved(_tokenId);

    require(isSenderAllowed(_tokenId, tokenOwner, approved), 'Sender not allowed');

    if (approved != address(0x0)) {
        _removeApproval(_tokenId, tokenOwner);
    }

    // ... etc
}

调试的一个小解决方案(在本地区块链上,如Ganache或Remix VM emulator)可以使用事件日志。您可以在事务返回对象中看到它们(如果未还原发送)。然而,这不是一个好的实践,我仍然建议您编写尽可能简单的函数,这样您就不必调试那么多

contract MyContract {
    event LogString(string memory _value);
    event LogAddress(address _value);

    function foo() external {
        emit LogString("myString");
        emit LogAddress(address(0x123));
    }
}

太好了,谢谢!由于我仍在从事我最初的独立项目,我真的希望能够得到安全性,能够不断检查我的输出,但我猜没有运气。谢谢你的信息。
function _removeApproval(uint256 _tokenId, address _tokenOwner) private {
    tokenApprovals[_tokenId] = address(0x0);
    emit Approval(_tokenOwner, address(0x0), _tokenId);
}
contract MyContract {
    event LogString(string memory _value);
    event LogAddress(address _value);

    function foo() external {
        emit LogString("myString");
        emit LogAddress(address(0x123));
    }
}