首页 > 其他分享 >Foundry分叉测试实践

Foundry分叉测试实践

时间:2024-09-27 16:34:55浏览次数:1  
标签:staticcall 0x5615dEB798BB3E4dFa0139dFa1b3D433Cc23b72f Return Foundry UniswapV2Ad

主要是测试https://solidity-by-example.org/defi/uniswap-v2-add-remove-liquidity/中的这个例子,向Uniswap V2的WETH/USDT流动性池添加或删除流动性。

分叉测试方法

使用foundry新建一个项目: forge init AddRemoveLiquidity
合约源代码放在src目录,命名为UniswapV2Liquidity.sol,测试代码放在test目录,命名为UniswapV2Liquidity.t.sol ,
另外,为了使得调试信息更为直观,使用了console.sol进行日志输出:

  1. 合约中引入,import "forge-std/console.sol";
  2. foundry.toml 配置文件中启用 ffi = true ,允许 Foundry 运行本地命令和输出日志。
  3. forge test -vvvv 选项来启用更高的日志级别,这样调试信息才能被打印出来。

最后,运行forge test -vvvv --fork-url https://eth-mainnet.g.alchemy.com/v2/ACCESS_TOKEN --fork-block-number 20623798,fork主网,设置指定区块号,执行分叉测试。

测试sol文件

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.26;

import {Test} from "forge-std/Test.sol";
import "forge-std/console.sol";
import "../src/UniswapV2Liquidity.sol";

IERC20 constant WETH = IERC20(0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2);
IERC20 constant USDT = IERC20(0xdAC17F958D2ee523a2206206994597C13D831ec7);
IERC20 constant PAIR = IERC20(0x0d4a11d5EEaaC28EC3F61d100daF4d40471f1852);

contract UniswapV2AddLiquidityTest is Test {
    UniswapV2AddLiquidity private uni = new UniswapV2AddLiquidity();

    //  Add WETH/USDT Liquidity to Uniswap
    function testAddLiquidity() public {
        // Deal test USDT and WETH to this contract
        deal(address(USDT), address(this), 1e6 * 1e6);
        assertEq(USDT.balanceOf(address(this)), 1e6 * 1e6, "USDT balance incorrect");
        deal(address(WETH), address(this), 1e6 * 1e18);
        assertEq(WETH.balanceOf(address(this)), 1e6 * 1e18, "WETH balance incorrect");
        console.log("\u6dfb\u52a0\u6d41\u52a8\u6027\u6d4b\u8bd5...");

        console.log("UniswapV2AddLiquidityTest USDT balance: %s" , USDT.balanceOf(address(this)) / 1e6);
        console.log("UniswapV2AddLiquidityTest WETH balance: %s" , WETH.balanceOf(address(this)) / 1e18);

        // Approve uni for transferring
        safeApprove(WETH, address(uni), 1e64);
        safeApprove(USDT, address(uni), 1e64);

        uni.addLiquidity(address(WETH), address(USDT), 1 * 1e18, 2435 * 1e6);
        console.log("addLiquidity...");

        assertGt(PAIR.balanceOf(address(uni)), 0, "pair balance 0");

        console.log("UniswapV2Liquidity WETH/USDT LP Token: %s", PAIR.balanceOf(address(uni)));
    }

    // Remove WETH/USDT Liquidity from Uniswap
    function testRemoveLiquidity() public {
        // Deal LP tokens to uni
        deal(address(PAIR), address(uni), 1e10);
        assertEq(PAIR.balanceOf(address(uni)), 1e10, "LP tokens balance = 0");
        assertEq(USDT.balanceOf(address(uni)), 0, "USDT balance non-zero");
        assertEq(WETH.balanceOf(address(uni)), 0, "WETH balance non-zero");

        console.log("\u5220\u9664\u6d41\u52a8\u6027\u6d4b\u8bd5...");
        console.log("UniswapV2Liquidity WETH/USDT LP Token: %s", PAIR.balanceOf(address(uni)));
        console.log("UniswapV2Liquidity USDT balance: %s", USDT.balanceOf(address(uni)) / 1e6);
        console.log("UniswapV2Liquidity WETH balance: %s", WETH.balanceOf(address(uni)) / 1e18);

        uni.removeLiquidity(address(WETH), address(USDT));
        console.log("removeLiquidity...");

        assertEq(PAIR.balanceOf(address(uni)), 0, "LP tokens balance != 0");
        assertGt(USDT.balanceOf(address(uni)), 0, "USDT balance = 0");
        assertGt(WETH.balanceOf(address(uni)), 0, "WETH balance = 0");

        console.log("UniswapV2Liquidity WETH/USDT LP Token: %s", PAIR.balanceOf(address(uni)));
        console.log("UniswapV2Liquidity USDT balance: %s", USDT.balanceOf(address(uni)) / 1e6);
        console.log("UniswapV2Liquidity WETH balance: %s", WETH.balanceOf(address(uni)));
    }

    /**
     * @dev The transferFrom function may or may not return a bool.
     * The ERC-20 spec returns a bool, but some tokens don't follow the spec.
     * Need to check if data is empty or true.
     */
    function safeTransferFrom(
        IERC20 token,
        address sender,
        address recipient,
        uint256 amount
    ) internal {
        (bool success, bytes memory returnData) = address(token).call(
            abi.encodeCall(IERC20.transferFrom, (sender, recipient, amount))
        );
        require(
            success
                && (returnData.length == 0 || abi.decode(returnData, (bool))),
            "Transfer from fail"
        );
    }

    /**
     * @dev The approve function may or may not return a bool.
     * The ERC-20 spec returns a bool, but some tokens don't follow the spec.
     * Need to check if data is empty or true.
     */
    function safeApprove(IERC20 token, address spender, uint256 amount)
        internal
    {
        (bool success, bytes memory returnData) = address(token).call(
            abi.encodeCall(IERC20.approve, (spender, amount))
        );
        require(
            success
                && (returnData.length == 0 || abi.decode(returnData, (bool))),
            "Approve fail"
        );
    }
}

运行结果:

[⠊] Compiling...
[⠒] Compiling 1 files with Solc 0.8.27
[⠑] Solc 0.8.27 finished in 1.51s
Compiler run successful with warnings:
Warning (2072): Unused local variable.
  --> src/UniswapV2Liquidity.sol:23:10:
   |
23 |         (uint256 amountA, uint256 amountB, uint256 liquidity) = IUniswapV2Router(
   |          ^^^^^^^^^^^^^^^

Warning (2072): Unused local variable.
  --> src/UniswapV2Liquidity.sol:23:27:
   |
23 |         (uint256 amountA, uint256 amountB, uint256 liquidity) = IUniswapV2Router(
   |                           ^^^^^^^^^^^^^^^

Warning (2072): Unused local variable.
  --> src/UniswapV2Liquidity.sol:23:44:
   |
23 |         (uint256 amountA, uint256 amountB, uint256 liquidity) = IUniswapV2Router(
   |                                            ^^^^^^^^^^^^^^^^^

Warning (2072): Unused local variable.
  --> src/UniswapV2Liquidity.sol:43:10:
   |
43 |         (uint256 amountA, uint256 amountB) = IUniswapV2Router(ROUTER)
   |          ^^^^^^^^^^^^^^^

Warning (2072): Unused local variable.
  --> src/UniswapV2Liquidity.sol:43:27:
   |
43 |         (uint256 amountA, uint256 amountB) = IUniswapV2Router(ROUTER)
   |                           ^^^^^^^^^^^^^^^


Ran 2 tests for test/UniswapV2Liquidity.t.sol:UniswapV2AddLiquidityTest
[PASS] testAddLiquidity() (gas: 575384)
Logs:
  添加流动性测试...
  UniswapV2AddLiquidityTest USDT balance: 1000000
  UniswapV2AddLiquidityTest WETH balance: 1000000
  addLiquidity...
  UniswapV2Liquidity WETH/USDT LP Token: 19108473809684

Traces:
  [724496] UniswapV2AddLiquidityTest::testAddLiquidity()
    ├─ [5031] 0xdAC17F958D2ee523a2206206994597C13D831ec7::balanceOf(UniswapV2AddLiquidityTest: [0x7FA9385bE102ac3EAc297483Dd6233D62b3e1496]) [staticcall]
    │   └─ ← [Return] 100000000 [1e8]
    ├─ [0] VM::record()
    │   └─ ← [Return]
    ├─ [1031] 0xdAC17F958D2ee523a2206206994597C13D831ec7::balanceOf(UniswapV2AddLiquidityTest: [0x7FA9385bE102ac3EAc297483Dd6233D62b3e1496]) [staticcall]
    │   └─ ← [Return] 100000000 [1e8]
    ├─ [0] VM::accesses(0xdAC17F958D2ee523a2206206994597C13D831ec7)
    │   └─ ← [Return] [0x000000000000000000000000000000000000000000000000000000000000000a, 0x6e10ff27cae71a13525bd61167857e5c982b4674c8e654900e4e9d5035811f78], []
    ├─ [0] VM::load(0xdAC17F958D2ee523a2206206994597C13D831ec7, 0x6e10ff27cae71a13525bd61167857e5c982b4674c8e654900e4e9d5035811f78) [staticcall]
    │   └─ ← [Return] 0x0000000000000000000000000000000000000000000000000000000005f5e100
    ├─ [0] VM::load(0xdAC17F958D2ee523a2206206994597C13D831ec7, 0x6e10ff27cae71a13525bd61167857e5c982b4674c8e654900e4e9d5035811f78) [staticcall]
    │   └─ ← [Return] 0x0000000000000000000000000000000000000000000000000000000005f5e100
    ├─ [1031] 0xdAC17F958D2ee523a2206206994597C13D831ec7::balanceOf(UniswapV2AddLiquidityTest: [0x7FA9385bE102ac3EAc297483Dd6233D62b3e1496]) [staticcall]
    │   └─ ← [Return] 100000000 [1e8]
    ├─ [0] VM::store(0xdAC17F958D2ee523a2206206994597C13D831ec7, 0x6e10ff27cae71a13525bd61167857e5c982b4674c8e654900e4e9d5035811f78, 0x0000000000000000000000000000000000000000000000000000000000000000)
    │   └─ ← [Return]
    ├─ [1031] 0xdAC17F958D2ee523a2206206994597C13D831ec7::balanceOf(UniswapV2AddLiquidityTest: [0x7FA9385bE102ac3EAc297483Dd6233D62b3e1496]) [staticcall]
    │   └─ ← [Return] 0
    ├─ [0] VM::store(0xdAC17F958D2ee523a2206206994597C13D831ec7, 0x6e10ff27cae71a13525bd61167857e5c982b4674c8e654900e4e9d5035811f78, 0x0000000000000000000000000000000000000000000000000000000005f5e100)
    │   └─ ← [Return]
    ├─ emit SlotFound(who: 0xdAC17F958D2ee523a2206206994597C13D831ec7, fsig: 0x70a08231, keysHash: 0x5ff10565516c110180bb9cc111cdbc2b0a68e09ff7fac17290373c3aa4a1bb03, slot: 49784443915320261189887103614045882155521089248264299114442679287293484801912 [4.978e76])
    ├─ [0] VM::load(0xdAC17F958D2ee523a2206206994597C13D831ec7, 0x6e10ff27cae71a13525bd61167857e5c982b4674c8e654900e4e9d5035811f78) [staticcall]
    │   └─ ← [Return] 0x0000000000000000000000000000000000000000000000000000000005f5e100
    ├─ [0] VM::store(0xdAC17F958D2ee523a2206206994597C13D831ec7, 0x6e10ff27cae71a13525bd61167857e5c982b4674c8e654900e4e9d5035811f78, 0x000000000000000000000000000000000000000000000000000000e8d4a51000)
    │   └─ ← [Return]
    ├─ [1031] 0xdAC17F958D2ee523a2206206994597C13D831ec7::balanceOf(UniswapV2AddLiquidityTest: [0x7FA9385bE102ac3EAc297483Dd6233D62b3e1496]) [staticcall]
    │   └─ ← [Return] 1000000000000 [1e12]
    ├─ [1031] 0xdAC17F958D2ee523a2206206994597C13D831ec7::balanceOf(UniswapV2AddLiquidityTest: [0x7FA9385bE102ac3EAc297483Dd6233D62b3e1496]) [staticcall]
    │   └─ ← [Return] 1000000000000 [1e12]
    ├─ [0] VM::assertEq(1000000000000 [1e12], 1000000000000 [1e12], "USDT balance incorrect") [staticcall]
    │   └─ ← [Return]
    ├─ [2534] 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2::balanceOf(UniswapV2AddLiquidityTest: [0x7FA9385bE102ac3EAc297483Dd6233D62b3e1496]) [staticcall]
    │   └─ ← [Return] 200000000000000000 [2e17]
    ├─ [0] VM::record()
    │   └─ ← [Return]
    ├─ [534] 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2::balanceOf(UniswapV2AddLiquidityTest: [0x7FA9385bE102ac3EAc297483Dd6233D62b3e1496]) [staticcall]
    │   └─ ← [Return] 200000000000000000 [2e17]
    ├─ [0] VM::accesses(0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2)
    │   └─ ← [Return] [0x1da434b76eba4736d6e760bfd78cbf883a0776ee1666a9157f99ab1b97923a3c], []
    ├─ [0] VM::load(0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2, 0x1da434b76eba4736d6e760bfd78cbf883a0776ee1666a9157f99ab1b97923a3c) [staticcall]
    │   └─ ← [Return] 0x00000000000000000000000000000000000000000000000002c68af0bb140000
    ├─ [0] VM::load(0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2, 0x1da434b76eba4736d6e760bfd78cbf883a0776ee1666a9157f99ab1b97923a3c) [staticcall]
    │   └─ ← [Return] 0x00000000000000000000000000000000000000000000000002c68af0bb140000
    ├─ [534] 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2::balanceOf(UniswapV2AddLiquidityTest: [0x7FA9385bE102ac3EAc297483Dd6233D62b3e1496]) [staticcall]
    │   └─ ← [Return] 200000000000000000 [2e17]
    ├─ [0] VM::store(0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2, 0x1da434b76eba4736d6e760bfd78cbf883a0776ee1666a9157f99ab1b97923a3c, 0x0000000000000000000000000000000000000000000000000000000000000000)
    │   └─ ← [Return]
    ├─ [534] 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2::balanceOf(UniswapV2AddLiquidityTest: [0x7FA9385bE102ac3EAc297483Dd6233D62b3e1496]) [staticcall]
    │   └─ ← [Return] 0
    ├─ [0] VM::store(0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2, 0x1da434b76eba4736d6e760bfd78cbf883a0776ee1666a9157f99ab1b97923a3c, 0x00000000000000000000000000000000000000000000000002c68af0bb140000)
    │   └─ ← [Return]
    ├─ emit SlotFound(who: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2, fsig: 0x70a08231, keysHash: 0x5ff10565516c110180bb9cc111cdbc2b0a68e09ff7fac17290373c3aa4a1bb03, slot: 13407199363679635973052879518465057167389910613330280238043615909335847287356 [1.34e76])
    ├─ [0] VM::load(0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2, 0x1da434b76eba4736d6e760bfd78cbf883a0776ee1666a9157f99ab1b97923a3c) [staticcall]
    │   └─ ← [Return] 0x00000000000000000000000000000000000000000000000002c68af0bb140000
    ├─ [0] VM::store(0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2, 0x1da434b76eba4736d6e760bfd78cbf883a0776ee1666a9157f99ab1b97923a3c, 0x00000000000000000000000000000000000000000000d3c21bcecceda1000000)
    │   └─ ← [Return]
    ├─ [534] 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2::balanceOf(UniswapV2AddLiquidityTest: [0x7FA9385bE102ac3EAc297483Dd6233D62b3e1496]) [staticcall]
    │   └─ ← [Return] 1000000000000000000000000 [1e24]
    ├─ [534] 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2::balanceOf(UniswapV2AddLiquidityTest: [0x7FA9385bE102ac3EAc297483Dd6233D62b3e1496]) [staticcall]
    │   └─ ← [Return] 1000000000000000000000000 [1e24]
    ├─ [0] VM::assertEq(1000000000000000000000000 [1e24], 1000000000000000000000000 [1e24], "WETH balance incorrect") [staticcall]
    │   └─ ← [Return]
    ├─ [0] console::log("添加流动性测试...") [staticcall]
    │   └─ ← [Stop]
    ├─ [1031] 0xdAC17F958D2ee523a2206206994597C13D831ec7::balanceOf(UniswapV2AddLiquidityTest: [0x7FA9385bE102ac3EAc297483Dd6233D62b3e1496]) [staticcall]
    │   └─ ← [Return] 1000000000000 [1e12]
    ├─ [0] console::log("UniswapV2AddLiquidityTest USDT balance: %s", 1000000 [1e6]) [staticcall]
    │   └─ ← [Stop]
    ├─ [534] 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2::balanceOf(UniswapV2AddLiquidityTest: [0x7FA9385bE102ac3EAc297483Dd6233D62b3e1496]) [staticcall]
    │   └─ ← [Return] 1000000000000000000000000 [1e24]
    ├─ [0] console::log("UniswapV2AddLiquidityTest WETH balance: %s", 1000000 [1e6]) [staticcall]
    │   └─ ← [Stop]
    ├─ [24420] 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2::approve(UniswapV2AddLiquidity: [0x5615dEB798BB3E4dFa0139dFa1b3D433Cc23b72f], 10000000000000000000000000000000000000000000000000000000000000000 [1e64])
    │   ├─ emit Approval(owner: UniswapV2AddLiquidityTest: [0x7FA9385bE102ac3EAc297483Dd6233D62b3e1496], spender: UniswapV2AddLiquidity: [0x5615dEB798BB3E4dFa0139dFa1b3D433Cc23b72f], value: 10000000000000000000000000000000000000000000000000000000000000000 [1e64])
    │   └─ ← [Return] true
    ├─ [24953] 0xdAC17F958D2ee523a2206206994597C13D831ec7::approve(UniswapV2AddLiquidity: [0x5615dEB798BB3E4dFa0139dFa1b3D433Cc23b72f], 10000000000000000000000000000000000000000000000000000000000000000 [1e64])
    │   ├─ emit Approval(owner: UniswapV2AddLiquidityTest: [0x7FA9385bE102ac3EAc297483Dd6233D62b3e1496], spender: UniswapV2AddLiquidity: [0x5615dEB798BB3E4dFa0139dFa1b3D433Cc23b72f], value: 10000000000000000000000000000000000000000000000000000000000000000 [1e64])
    │   └─ ← [Stop]
    ├─ [221669] UniswapV2AddLiquidity::addLiquidity(0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2, 0xdAC17F958D2ee523a2206206994597C13D831ec7, 1000000000000000000 [1e18], 2435000000 [2.435e9])
    │   ├─ [26048] 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2::transferFrom(UniswapV2AddLiquidityTest: [0x7FA9385bE102ac3EAc297483Dd6233D62b3e1496], UniswapV2AddLiquidity: [0x5615dEB798BB3E4dFa0139dFa1b3D433Cc23b72f], 1000000000000000000 [1e18])
    │   │   ├─ emit Transfer(from: UniswapV2AddLiquidityTest: [0x7FA9385bE102ac3EAc297483Dd6233D62b3e1496], to: UniswapV2AddLiquidity: [0x5615dEB798BB3E4dFa0139dFa1b3D433Cc23b72f], value: 1000000000000000000 [1e18])
    │   │   └─ ← [Return] true
    │   ├─ [35224] 0xdAC17F958D2ee523a2206206994597C13D831ec7::transferFrom(UniswapV2AddLiquidityTest: [0x7FA9385bE102ac3EAc297483Dd6233D62b3e1496], UniswapV2AddLiquidity: [0x5615dEB798BB3E4dFa0139dFa1b3D433Cc23b72f], 2435000000 [2.435e9])
    │   │   ├─ emit Transfer(from: UniswapV2AddLiquidityTest: [0x7FA9385bE102ac3EAc297483Dd6233D62b3e1496], to: UniswapV2AddLiquidity: [0x5615dEB798BB3E4dFa0139dFa1b3D433Cc23b72f], value: 2435000000 [2.435e9])
    │   │   └─ ← [Stop]
    │   ├─ [24420] 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2::approve(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D, 1000000000000000000 [1e18])
    │   │   ├─ emit Approval(owner: UniswapV2AddLiquidity: [0x5615dEB798BB3E4dFa0139dFa1b3D433Cc23b72f], spender: 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D, value: 1000000000000000000 [1e18])
    │   │   └─ ← [Return] true
    │   ├─ [24953] 0xdAC17F958D2ee523a2206206994597C13D831ec7::approve(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D, 2435000000 [2.435e9])
    │   │   ├─ emit Approval(owner: UniswapV2AddLiquidity: [0x5615dEB798BB3E4dFa0139dFa1b3D433Cc23b72f], spender: 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D, value: 2435000000 [2.435e9])
    │   │   └─ ← [Stop]
    │   ├─ [103656] 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D::addLiquidity(0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2, 0xdAC17F958D2ee523a2206206994597C13D831ec7, 1000000000000000000 [1e18], 2435000000 [2.435e9], 1, 1, UniswapV2AddLiquidity: [0x5615dEB798BB3E4dFa0139dFa1b3D433Cc23b72f], 1724808407 [1.724e9])
    │   │   ├─ [2564] 0x5C69bEe701ef814a2B6a3EDD4B1652CB9cc5aA6f::getPair(0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2, 0xdAC17F958D2ee523a2206206994597C13D831ec7) [staticcall]
    │   │   │   └─ ← [Return] 0x0d4a11d5EEaaC28EC3F61d100daF4d40471f1852
    │   │   ├─ [2504] 0x0d4a11d5EEaaC28EC3F61d100daF4d40471f1852::getReserves() [staticcall]
    │   │   │   └─ ← [Return] 0x0000000000000000000000000000000000000000000005008e7105f2ba39b18000000000000000000000000000000000000000000000000000003475da1d3c250000000000000000000000000000000000000000000000000000000066ce7ccb
    │   │   ├─ [8948] 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2::transferFrom(UniswapV2AddLiquidity: [0x5615dEB798BB3E4dFa0139dFa1b3D433Cc23b72f], 0x0d4a11d5EEaaC28EC3F61d100daF4d40471f1852, 997209288222181203 [9.972e17])
    │   │   │   ├─ emit Transfer(from: UniswapV2AddLiquidity: [0x5615dEB798BB3E4dFa0139dFa1b3D433Cc23b72f], to: 0x0d4a11d5EEaaC28EC3F61d100daF4d40471f1852, value: 997209288222181203 [9.972e17])
    │   │   │   └─ ← [Return] true
    │   │   ├─ [12124] 0xdAC17F958D2ee523a2206206994597C13D831ec7::transferFrom(UniswapV2AddLiquidity: [0x5615dEB798BB3E4dFa0139dFa1b3D433Cc23b72f], 0x0d4a11d5EEaaC28EC3F61d100daF4d40471f1852, 2435000000 [2.435e9])
    │   │   │   ├─ emit Transfer(from: UniswapV2AddLiquidity: [0x5615dEB798BB3E4dFa0139dFa1b3D433Cc23b72f], to: 0x0d4a11d5EEaaC28EC3F61d100daF4d40471f1852, value: 2435000000 [2.435e9])
    │   │   │   └─ ← [Stop]
    │   │   ├─ [66290] 0x0d4a11d5EEaaC28EC3F61d100daF4d40471f1852::mint(UniswapV2AddLiquidity: [0x5615dEB798BB3E4dFa0139dFa1b3D433Cc23b72f])
    │   │   │   ├─ [534] 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2::balanceOf(0x0d4a11d5EEaaC28EC3F61d100daF4d40471f1852) [staticcall]
    │   │   │   │   └─ ← [Return] 23623093615202266888403 [2.362e22]
    │   │   │   ├─ [1031] 0xdAC17F958D2ee523a2206206994597C13D831ec7::balanceOf(0x0d4a11d5EEaaC28EC3F61d100daF4d40471f1852) [staticcall]
    │   │   │   │   └─ ← [Return] 57683210167013 [5.768e13]
    │   │   │   ├─ [2314] 0x5C69bEe701ef814a2B6a3EDD4B1652CB9cc5aA6f::feeTo() [staticcall]
    │   │   │   │   └─ ← [Return] 0x0000000000000000000000000000000000000000000000000000000000000000
    │   │   │   ├─ emit Transfer(from: 0x0000000000000000000000000000000000000000, to: UniswapV2AddLiquidity: [0x5615dEB798BB3E4dFa0139dFa1b3D433Cc23b72f], value: 19108473809684 [1.91e13])
    │   │   │   ├─ emit Sync(: 23623093615202266888403 [2.362e22], : 57683210167013 [5.768e13])
    │   │   │   ├─ emit Mint(param0: 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D, param1: 997209288222181203 [9.972e17], param2: 2435000000 [2.435e9])
    │   │   │   └─ ← [Return] 0x0000000000000000000000000000000000000000000000000000116109cb2b14
    │   │   └─ ← [Return] 997209288222181203 [9.972e17], 2435000000 [2.435e9], 19108473809684 [1.91e13]
    │   └─ ← [Stop]
    ├─ [0] console::log("addLiquidity...") [staticcall]
    │   └─ ← [Stop]
    ├─ [480] 0x0d4a11d5EEaaC28EC3F61d100daF4d40471f1852::balanceOf(UniswapV2AddLiquidity: [0x5615dEB798BB3E4dFa0139dFa1b3D433Cc23b72f]) [staticcall]
    │   └─ ← [Return] 19108473809684 [1.91e13]
    ├─ [0] VM::assertGt(19108473809684 [1.91e13], 0, "pair balance 0") [staticcall]
    │   └─ ← [Return]
    ├─ [480] 0x0d4a11d5EEaaC28EC3F61d100daF4d40471f1852::balanceOf(UniswapV2AddLiquidity: [0x5615dEB798BB3E4dFa0139dFa1b3D433Cc23b72f]) [staticcall]
    │   └─ ← [Return] 19108473809684 [1.91e13]
    ├─ [0] console::log("UniswapV2Liquidity WETH/USDT LP Token: %s", 19108473809684 [1.91e13]) [staticcall]
    │   └─ ← [Stop]
    └─ ← [Stop]

[PASS] testRemoveLiquidity() (gas: 353196)
Logs:
  删除流动性测试...
  UniswapV2Liquidity WETH/USDT LP Token: 10000000000
  UniswapV2Liquidity USDT balance: 0
  UniswapV2Liquidity WETH balance: 0
  removeLiquidity...
  UniswapV2Liquidity WETH/USDT LP Token: 0
  UniswapV2Liquidity USDT balance: 1
  UniswapV2Liquidity WETH balance: 521867574644689

Traces:
  [446760] UniswapV2AddLiquidityTest::testRemoveLiquidity()
    ├─ [2480] 0x0d4a11d5EEaaC28EC3F61d100daF4d40471f1852::balanceOf(UniswapV2AddLiquidity: [0x5615dEB798BB3E4dFa0139dFa1b3D433Cc23b72f]) [staticcall]
    │   └─ ← [Return] 0
    ├─ [0] VM::record()
    │   └─ ← [Return]
    ├─ [480] 0x0d4a11d5EEaaC28EC3F61d100daF4d40471f1852::balanceOf(UniswapV2AddLiquidity: [0x5615dEB798BB3E4dFa0139dFa1b3D433Cc23b72f]) [staticcall]
    │   └─ ← [Return] 0
    ├─ [0] VM::accesses(0x0d4a11d5EEaaC28EC3F61d100daF4d40471f1852)
    │   └─ ← [Return] [0xe135b438163c07f06263f9c7a911682b41bdc632d00c89620a1db653a7041b6a], []
    ├─ [0] VM::load(0x0d4a11d5EEaaC28EC3F61d100daF4d40471f1852, 0xe135b438163c07f06263f9c7a911682b41bdc632d00c89620a1db653a7041b6a) [staticcall]
    │   └─ ← [Return] 0x0000000000000000000000000000000000000000000000000000000000000000
    ├─ emit WARNING_UninitedSlot(who: 0x0d4a11d5EEaaC28EC3F61d100daF4d40471f1852, slot: 101865277652109193157934748849462594086263052630085157397691791389601577573226 [1.018e77])
    ├─ [0] VM::load(0x0d4a11d5EEaaC28EC3F61d100daF4d40471f1852, 0xe135b438163c07f06263f9c7a911682b41bdc632d00c89620a1db653a7041b6a) [staticcall]
    │   └─ ← [Return] 0x0000000000000000000000000000000000000000000000000000000000000000
    ├─ [480] 0x0d4a11d5EEaaC28EC3F61d100daF4d40471f1852::balanceOf(UniswapV2AddLiquidity: [0x5615dEB798BB3E4dFa0139dFa1b3D433Cc23b72f]) [staticcall]
    │   └─ ← [Return] 0
    ├─ [0] VM::store(0x0d4a11d5EEaaC28EC3F61d100daF4d40471f1852, 0xe135b438163c07f06263f9c7a911682b41bdc632d00c89620a1db653a7041b6a, 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff)
    │   └─ ← [Return]
    ├─ [480] 0x0d4a11d5EEaaC28EC3F61d100daF4d40471f1852::balanceOf(UniswapV2AddLiquidity: [0x5615dEB798BB3E4dFa0139dFa1b3D433Cc23b72f]) [staticcall]
    │   └─ ← [Return] 115792089237316195423570985008687907853269984665640564039457584007913129639935 [1.157e77]
    ├─ [0] VM::store(0x0d4a11d5EEaaC28EC3F61d100daF4d40471f1852, 0xe135b438163c07f06263f9c7a911682b41bdc632d00c89620a1db653a7041b6a, 0x0000000000000000000000000000000000000000000000000000000000000000)
    │   └─ ← [Return]
    ├─ emit SlotFound(who: 0x0d4a11d5EEaaC28EC3F61d100daF4d40471f1852, fsig: 0x70a08231, keysHash: 0x996b860ef646da948c7d745162e3851398cba818db7bc8c7a4d9d465a54dfa11, slot: 101865277652109193157934748849462594086263052630085157397691791389601577573226 [1.018e77])
    ├─ [0] VM::load(0x0d4a11d5EEaaC28EC3F61d100daF4d40471f1852, 0xe135b438163c07f06263f9c7a911682b41bdc632d00c89620a1db653a7041b6a) [staticcall]
    │   └─ ← [Return] 0x0000000000000000000000000000000000000000000000000000000000000000
    ├─ [0] VM::store(0x0d4a11d5EEaaC28EC3F61d100daF4d40471f1852, 0xe135b438163c07f06263f9c7a911682b41bdc632d00c89620a1db653a7041b6a, 0x00000000000000000000000000000000000000000000000000000002540be400)
    │   └─ ← [Return]
    ├─ [480] 0x0d4a11d5EEaaC28EC3F61d100daF4d40471f1852::balanceOf(UniswapV2AddLiquidity: [0x5615dEB798BB3E4dFa0139dFa1b3D433Cc23b72f]) [staticcall]
    │   └─ ← [Return] 10000000000 [1e10]
    ├─ [480] 0x0d4a11d5EEaaC28EC3F61d100daF4d40471f1852::balanceOf(UniswapV2AddLiquidity: [0x5615dEB798BB3E4dFa0139dFa1b3D433Cc23b72f]) [staticcall]
    │   └─ ← [Return] 10000000000 [1e10]
    ├─ [0] VM::assertEq(10000000000 [1e10], 10000000000 [1e10], "LP tokens balance = 0") [staticcall]
    │   └─ ← [Return]
    ├─ [5031] 0xdAC17F958D2ee523a2206206994597C13D831ec7::balanceOf(UniswapV2AddLiquidity: [0x5615dEB798BB3E4dFa0139dFa1b3D433Cc23b72f]) [staticcall]
    │   └─ ← [Return] 0
    ├─ [0] VM::assertEq(0, 0, "USDT balance non-zero") [staticcall]
    │   └─ ← [Return]
    ├─ [2534] 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2::balanceOf(UniswapV2AddLiquidity: [0x5615dEB798BB3E4dFa0139dFa1b3D433Cc23b72f]) [staticcall]
    │   └─ ← [Return] 0
    ├─ [0] VM::assertEq(0, 0, "WETH balance non-zero") [staticcall]
    │   └─ ← [Return]
    ├─ [0] console::log("删除流动性测试...") [staticcall]
    │   └─ ← [Stop]
    ├─ [480] 0x0d4a11d5EEaaC28EC3F61d100daF4d40471f1852::balanceOf(UniswapV2AddLiquidity: [0x5615dEB798BB3E4dFa0139dFa1b3D433Cc23b72f]) [staticcall]
    │   └─ ← [Return] 10000000000 [1e10]
    ├─ [0] console::log("UniswapV2Liquidity WETH/USDT LP Token: %s", 10000000000 [1e10]) [staticcall]
    │   └─ ← [Stop]
    ├─ [1031] 0xdAC17F958D2ee523a2206206994597C13D831ec7::balanceOf(UniswapV2AddLiquidity: [0x5615dEB798BB3E4dFa0139dFa1b3D433Cc23b72f]) [staticcall]
    │   └─ ← [Return] 0
    ├─ [0] console::log("UniswapV2Liquidity USDT balance: %s", 0) [staticcall]
    │   └─ ← [Stop]
    ├─ [534] 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2::balanceOf(UniswapV2AddLiquidity: [0x5615dEB798BB3E4dFa0139dFa1b3D433Cc23b72f]) [staticcall]
    │   └─ ← [Return] 0
    ├─ [0] console::log("UniswapV2Liquidity WETH balance: %s", 0) [staticcall]
    │   └─ ← [Stop]
    ├─ [180060] UniswapV2AddLiquidity::removeLiquidity(0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2, 0xdAC17F958D2ee523a2206206994597C13D831ec7)
    │   ├─ [2564] 0x5C69bEe701ef814a2B6a3EDD4B1652CB9cc5aA6f::getPair(0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2, 0xdAC17F958D2ee523a2206206994597C13D831ec7) [staticcall]
    │   │   └─ ← [Return] 0x0d4a11d5EEaaC28EC3F61d100daF4d40471f1852
    │   ├─ [480] 0x0d4a11d5EEaaC28EC3F61d100daF4d40471f1852::balanceOf(UniswapV2AddLiquidity: [0x5615dEB798BB3E4dFa0139dFa1b3D433Cc23b72f]) [staticcall]
    │   │   └─ ← [Return] 10000000000 [1e10]
    │   ├─ [24442] 0x0d4a11d5EEaaC28EC3F61d100daF4d40471f1852::approve(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D, 10000000000 [1e10])
    │   │   ├─ emit Approval(owner: UniswapV2AddLiquidity: [0x5615dEB798BB3E4dFa0139dFa1b3D433Cc23b72f], spender: 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D, value: 10000000000 [1e10])
    │   │   └─ ← [Return] true
    │   ├─ [144791] 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D::removeLiquidity(0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2, 0xdAC17F958D2ee523a2206206994597C13D831ec7, 10000000000 [1e10], 1, 1, UniswapV2AddLiquidity: [0x5615dEB798BB3E4dFa0139dFa1b3D433Cc23b72f], 1724808407 [1.724e9])
    │   │   ├─ [25849] 0x0d4a11d5EEaaC28EC3F61d100daF4d40471f1852::transferFrom(UniswapV2AddLiquidity: [0x5615dEB798BB3E4dFa0139dFa1b3D433Cc23b72f], 0x0d4a11d5EEaaC28EC3F61d100daF4d40471f1852, 10000000000 [1e10])
    │   │   │   ├─ emit Transfer(from: UniswapV2AddLiquidity: [0x5615dEB798BB3E4dFa0139dFa1b3D433Cc23b72f], to: 0x0d4a11d5EEaaC28EC3F61d100daF4d40471f1852, value: 10000000000 [1e10])
    │   │   │   └─ ← [Return] true
    │   │   ├─ [116585] 0x0d4a11d5EEaaC28EC3F61d100daF4d40471f1852::burn(UniswapV2AddLiquidity: [0x5615dEB798BB3E4dFa0139dFa1b3D433Cc23b72f])
    │   │   │   ├─ [2534] 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2::balanceOf(0x0d4a11d5EEaaC28EC3F61d100daF4d40471f1852) [staticcall]
    │   │   │   │   └─ ← [Return] 23622096405914044707200 [2.362e22]
    │   │   │   ├─ [3031] 0xdAC17F958D2ee523a2206206994597C13D831ec7::balanceOf(0x0d4a11d5EEaaC28EC3F61d100daF4d40471f1852) [staticcall]
    │   │   │   │   └─ ← [Return] 57680775167013 [5.768e13]
    │   │   │   ├─ [2314] 0x5C69bEe701ef814a2B6a3EDD4B1652CB9cc5aA6f::feeTo() [staticcall]
    │   │   │   │   └─ ← [Return] 0x0000000000000000000000000000000000000000000000000000000000000000
    │   │   │   ├─ emit Transfer(from: 0x0d4a11d5EEaaC28EC3F61d100daF4d40471f1852, to: 0x0000000000000000000000000000000000000000, value: 10000000000 [1e10])
    │   │   │   ├─ [25962] 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2::transfer(UniswapV2AddLiquidity: [0x5615dEB798BB3E4dFa0139dFa1b3D433Cc23b72f], 521867574644689 [5.218e14])
    │   │   │   │   ├─ emit Transfer(from: 0x0d4a11d5EEaaC28EC3F61d100daF4d40471f1852, to: UniswapV2AddLiquidity: [0x5615dEB798BB3E4dFa0139dFa1b3D433Cc23b72f], value: 521867574644689 [5.218e14])
    │   │   │   │   └─ ← [Return] true
    │   │   │   ├─ [35601] 0xdAC17F958D2ee523a2206206994597C13D831ec7::transfer(UniswapV2AddLiquidity: [0x5615dEB798BB3E4dFa0139dFa1b3D433Cc23b72f], 1274303 [1.274e6])
    │   │   │   │   ├─ emit Transfer(from: 0x0d4a11d5EEaaC28EC3F61d100daF4d40471f1852, to: UniswapV2AddLiquidity: [0x5615dEB798BB3E4dFa0139dFa1b3D433Cc23b72f], value: 1274303 [1.274e6])
    │   │   │   │   └─ ← [Stop]
    │   │   │   ├─ [534] 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2::balanceOf(0x0d4a11d5EEaaC28EC3F61d100daF4d40471f1852) [staticcall]
    │   │   │   │   └─ ← [Return] 23622095884046470062511 [2.362e22]
    │   │   │   ├─ [1031] 0xdAC17F958D2ee523a2206206994597C13D831ec7::balanceOf(0x0d4a11d5EEaaC28EC3F61d100daF4d40471f1852) [staticcall]
    │   │   │   │   └─ ← [Return] 57680773892710 [5.768e13]
    │   │   │   ├─ emit Sync(: 23622095884046470062511 [2.362e22], : 57680773892710 [5.768e13])
    │   │   │   ├─ emit Burn(param0: 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D, param1: 521867574644689 [5.218e14], param2: 1274303 [1.274e6], param3: UniswapV2AddLiquidity: [0x5615dEB798BB3E4dFa0139dFa1b3D433Cc23b72f])
    │   │   │   └─ ← [Return] 0x0000000000000000000000000000000000000000000000000001daa2c3680fd100000000000000000000000000000000000000000000000000000000001371bf
    │   │   └─ ← [Return] 521867574644689 [5.218e14], 1274303 [1.274e6]
    │   └─ ← [Stop]
    ├─ [0] console::log("removeLiquidity...") [staticcall]
    │   └─ ← [Stop]
    ├─ [480] 0x0d4a11d5EEaaC28EC3F61d100daF4d40471f1852::balanceOf(UniswapV2AddLiquidity: [0x5615dEB798BB3E4dFa0139dFa1b3D433Cc23b72f]) [staticcall]
    │   └─ ← [Return] 0
    ├─ [0] VM::assertEq(0, 0, "LP tokens balance != 0") [staticcall]
    │   └─ ← [Return]
    ├─ [1031] 0xdAC17F958D2ee523a2206206994597C13D831ec7::balanceOf(UniswapV2AddLiquidity: [0x5615dEB798BB3E4dFa0139dFa1b3D433Cc23b72f]) [staticcall]
    │   └─ ← [Return] 1274303 [1.274e6]
    ├─ [0] VM::assertGt(1274303 [1.274e6], 0, "USDT balance = 0") [staticcall]
    │   └─ ← [Return]
    ├─ [534] 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2::balanceOf(UniswapV2AddLiquidity: [0x5615dEB798BB3E4dFa0139dFa1b3D433Cc23b72f]) [staticcall]
    │   └─ ← [Return] 521867574644689 [5.218e14]
    ├─ [0] VM::assertGt(521867574644689 [5.218e14], 0, "WETH balance = 0") [staticcall]
    │   └─ ← [Return]
    ├─ [480] 0x0d4a11d5EEaaC28EC3F61d100daF4d40471f1852::balanceOf(UniswapV2AddLiquidity: [0x5615dEB798BB3E4dFa0139dFa1b3D433Cc23b72f]) [staticcall]
    │   └─ ← [Return] 0
    ├─ [0] console::log("UniswapV2Liquidity WETH/USDT LP Token: %s", 0) [staticcall]
    │   └─ ← [Stop]
    ├─ [1031] 0xdAC17F958D2ee523a2206206994597C13D831ec7::balanceOf(UniswapV2AddLiquidity: [0x5615dEB798BB3E4dFa0139dFa1b3D433Cc23b72f]) [staticcall]
    │   └─ ← [Return] 1274303 [1.274e6]
    ├─ [0] console::log("UniswapV2Liquidity USDT balance: %s", 1) [staticcall]
    │   └─ ← [Stop]
    ├─ [534] 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2::balanceOf(UniswapV2AddLiquidity: [0x5615dEB798BB3E4dFa0139dFa1b3D433Cc23b72f]) [staticcall]
    │   └─ ← [Return] 521867574644689 [5.218e14]
    ├─ [0] console::log("UniswapV2Liquidity WETH balance: %s", 521867574644689 [5.218e14]) [staticcall]
    │   └─ ← [Stop]
    └─ ← [Stop]

Suite result: ok. 2 passed; 0 failed; 0 skipped; finished in 9.24ms (12.78ms CPU time)

Ran 1 test suite in 1.07s (9.24ms CPU time): 2 tests passed, 0 failed, 0 skipped (2 total tests)

标签:staticcall,0x5615dEB798BB3E4dFa0139dFa1b3D433Cc23b72f,Return,Foundry,UniswapV2Ad
From: https://www.cnblogs.com/lyhero11/p/18436035

相关文章

  • NOIP2024模拟测试赛(一)
    比赛链接A.tree当\(\forallv_i\le1\)时,可以直接从下往上贪心选,一个以\(u\)为根的子树中联通块如果权值和\(>k\)那么肯定能删到恰好\(k\)。否则的话就把这个联通块并到\(u\)父亲上再看就行。当\(\forallv_i\le2\)时,直接贪心可能有问题,大于\(k\)的权值和可能......
  • Ubuntu20同时安装并运行ORB SLAM2 、ORB SLAM3(详细安装版)、TUM数据集测试
    简要说明:用相同版本库同时安装ORBSLAM2、ORBSLAM3,并分别测试几段TUM-RGBD单目数据ubuntu20.04Pangolin0.6Eigen3opencv3.4.5一、换源通过软件或者修改sources.list换源,推荐清华源ubuntu|镜像站使用帮助|清华大学开源软件镜像站|TsinghuaOpenSourceMirror......
  • 基于 LangChain 的自动化测试用例的生成与执行
    在前面的章节中,分别介绍了Web、App、接口自动化测试用例的生成。但是在前文中实现的效果均为在控制台打印自动化测试的用例。用例需要手动粘贴,调整之后再执行。那么其实这个手动粘贴、执行的过程,也是可以直接通过人工智能完成的。应用价值通过人工智能代替人工操作的部分,节省时间,......
  • 【性能测试】关于性能测试的各种指标
    本指标适用于使用性能测试进行性能测试项目技术质量评价依据,规范技术测试结果评价,统一性能测试技术测试质量度量。应用系统技术质量度量指标范围广泛,本文难以涵盖全部。预期读者为测试管理人员、测试实施人员、技术支持人员、项目管理人员等系统技术质量相关人员。 1.系统性......
  • 软件测试学习笔记丨curl命令发送请求
    本文转自测试人社区,原文链接:https://ceshiren.com/t/topic/32332一、简介cURL是一个通过URL传输数据的,功能强大的命令行工具。cURL可以与ChromeDevtool工具配合使用,把浏览器发送的真实请求还原出来,附带认证信息,脱离浏览器执行,方便开发者重放请求、修改参数调试,编写脚本。也可以单......
  • 软件测试学习笔记丨Mock的价值与实战
    本文转自测试人社区,原文链接:https://ceshiren.com/t/topic/32331一、Mock的价值与意义1.1简介测试过程中,对于一些不容易构造或获取的对象,用一个虚拟的对象来替代它,达到相同的效果,这个虚拟的对象即Mock。当做测试时,如果后端某些接口还不成熟,所依赖的接口不稳定,所依赖的接口为第三方......
  • 渗透测试入门
    什么是渗透测试?定义:渗透测试完全模拟黑客可能使用的攻击技术和漏洞发现技术,对目标系统的安全做深入的探测,发现系统最脆弱的环节,以期发现和挖掘系统中存在的漏洞,然后输出渗透测试报告,并提交给网络所有者。网络所有者根据渗透人员提供的渗透测试报告,可以清晰知晓系统中存在的安全......
  • maven 使用SNAPSHOT版本确实可以帮助开发团队更高效地迭代和测试新功能
    使用SNAPSHOT版本确实可以帮助开发团队更高效地迭代和测试新功能。下面是一个更详细的解释:快速迭代频繁构建和部署:由于SNAPSHOT版本通常与持续集成(CI)工具结合使用,因此每次提交代码后都可以触发构建和部署流程。这意味着每次有新的代码更改时,都会有一个新的SNAPSHOT版本产......
  • jmeter+ant生成详细测试报告
     1.下载并安装,jdk、jmeter、ant这里说说ant怎么弄。下载Ant,地址:http://ant.apache.org/bindownload.cgi安装Ant,将下载后的压缩包直接解压到本地,  配置环境变量,在系统变量下新建变量ANT_HOME,值填ant的解压路径D:\WorkingSoftware\apache-ant-1.10.12-bin\apache-ant-1.1......
  • XX项目系统压力测试报告模板
    1.1、测试目的对XX系统的业务能力进行性能测试,客观、公正评估系统的性能现状。1、开发正确、有效的性能测试脚本,模拟业务员进行:XX、XX这2个单据新增保存、查询、编辑等操作;2、通过性能测试,客观、公正评估在当前环境下,被测系统的各项性能指标表现;3、验证被测系统的业务处......