JUnits - Do’s and Dont’s

本文介绍了JUnit测试用例的基本规范及注意事项,包括测试方法的命名、返回类型、异常处理等,强调了良好的测试习惯对于提高测试效率的重要性。
一个JUnit测试用例可以包含很多了测试,每个测试都通过一个方法实现,而测试方法都需要满足一些公约,以帮助JUnit和相关工具来自动发现和执行测试,这些公约是:

* 方法名前加“test”,如“testValidateOperator”
* 返回类型的测试方法必须为null
* 测试方法不能抛出任何异常
* 测试方法不能含有任何参数


编写JUnit测试还需要注意很多细节部分:首先,当你执行一个测试用例时,如果含有很多测试方法,JUnit将会消耗很多时间。因为每一个测试方法都需要用到不同的测试用例类,在调用测试方法前,JUnit会先调用 setUp() 方法;当测试方法执行完毕后将会调用tearDown()方法,不管执行的成功与否,setUp() 和 tearDown()方法都会被创建,之后还要清理测试环境。

在你编写JUnit之前,先要有良好的习惯:

* 在编写测试时,尽量减少依赖性
* 尽可能的使用简单的逻辑
* 如果允许,使用常量作为预期值
* 每个单元测试应该独立于所以其他的测试
* 每个单元测试应有明确的命名,并记录在案
* 所有的方法,不论重要度,都应当由一个适当的单元测试
* ……


点击查看详情:[url]http://www.theserverside.com/news/thread.tss?thread_id=55170[/url]
<think>我们正在分析用户的问题:用户在执行命令 `ping -s 1400 -M do 1.0.0.1 -I ppp0` 时遇到了错误提示 `ping: invalid option -- M`,需要解释这个错误的原因以及如何修正。 首先,我们需要知道不同操作系统和版本的ping命令参数可能不同。在Linux中,`-M`选项用于设置分片策略(如do, dont, want),但在某些系统(比如某些BSD系统或老版本)可能不支持`-M`选项,或者用户可能是在其他操作系统(如macOS)上运行,参数不同。 在Linux中,正确的用法是`-M`后面跟分片策略(do, dont, want)。然而,错误提示指出`-M`是无效选项,可能是因为: 1. 用户使用的ping命令版本不支持`-M`选项(比如是较老的版本,或者是在非Linux系统上)。 2. 用户可能是在macOS上,macOS的ping命令参数与Linux不同。 解决方案: 对于Linux系统,我们可以确认`-M`选项在较新的版本中存在。如果用户遇到此错误,可以尝试检查ping的版本,或者使用其他方式测试MTU(如使用`-s`指定数据包大小,但不使用`-M`,或者使用其他工具)。 但是,用户是在路由器环境下,通常路由器使用的是嵌入式Linux(如OpenWrt),其ping命令可能是busybox版本。而busybox的ping命令可能不支持`-M`选项。 因此,我们需要提供替代方案: 1. 首先,检查路由器上的ping命令是否支持`-M`。可以通过`ping -h`或`ping --help`查看帮助。 2. 如果不支持,可以使用另一种测试方法:通过逐渐增加`-s`的值来测试,直到出现分片或失败,从而确定MTU。 另外,在Linux中,我们也可以使用以下命令测试而不指定`-M`: `ping -s 1400 -I ppp0 1.0.0.1` 但是这样发送的是1400字节的数据包(包括8字节ICMP头,20字节IP头,实际IP数据包大小为1400+8=1408字节),如果链路的MTU小于这个值,路由器会进行分片(除非设置了DF位)。而原来的命令中`-M do`就是设置DF位(do not fragment),即不允许分片。 所以,在不支持`-M`选项的情况下,我们可以用另一种方式设置DF位:在Linux中,我们可以用`-D`选项(但注意,busybox的ping可能也不支持`-D`)或者使用其他工具。 另一种方法是使用`traceroute`的`-F`选项(设置DF位)并指定包大小,但可能更复杂。 因此,最通用的方法是使用`ping`不带`-M`,然后观察返回的错误信息。如果返回错误是“需要分片但DF位已设置”(frag needed and DF set),则说明MTU小于测试包大小。但实际上,如果不设置DF位,即使MTU不够,也会分片,这样我们就无法测试出MTU限制。 所以,我们需要一个替代方法来设置DF位。在busybox的ping中,可能没有直接设置DF位的选项。我们可以考虑使用其他工具,例如`hping3`,但路由器上可能没有安装。 因此,我们给出两种方案: 1. 尝试使用`-D`选项(在busybox中,`-D`可能是设置SO_DEBUG选项,而不是DF位)。所以这可能不行。 2. 如果路由器支持,可以使用`nping`(来自nmap工具包)或者安装其他工具。 考虑到路由器环境的限制,我们建议: - 首先,确认路由器上的ping版本(通过`ping -V`或`ping -h`)。 - 如果支持,使用正确的选项(比如在Linux中,`-M do`是正确的)。 - 如果不支持,尝试用`-s`指定包大小,然后观察是否能够收到回复。如果包太大,即使不分片,可能也不会收到回复(但这样无法区分是MTU问题还是网络不通)。 另外,在Linux中,还有一个传统的方法:使用`ping -s 1472`(因为1472+8(ICMP头)+20(IP头)=1500,刚好是标准MTU)。然后逐步减小,直到能通。但是,这里我们是在ppp0接口上,MTU已经设置为1400,所以我们测试的包大小应该是1400-28=1372(因为1400是IP层的MTU,所以ICMP包大小最大为1400-20-8=1372字节)。所以我们可以这样测试: `ping -s 1372 -I ppp0 1.0.0.1` 如果这个包能通,说明MTU至少是1400。如果这个包不通,而更小的包可以通,则说明MTU不够1400。 但是,这样测试并没有设置DF位,所以中间路由器可能会分片,导致即使MTU不够也能通。因此,这种方法只能测试端到端是否允许该大小的包,而不能测试路径MTU。 因此,我们回到问题:用户想测试在设置DF位的情况下,发送1400字节的数据包(实际IP包大小为1400+28=1428?注意:`-s`指定的是数据部分,不包括ICMP头8字节,但包括在IP包中,所以整个IP包的大小是`-s`的值+8(ICMP头)+20(IP头)?实际上,在ping命令中,`-s`指定的是ICMP数据部分的大小,所以整个ICMP包大小是`-s`+8,然后整个IP包大小是`-s`+28)。所以我们测试的MTU是针对IP包的大小。 由于原始命令中`-s 1400`表示发送的IP包大小为1428字节(1400+28),而ppp0的MTU为1400,所以这个包超过了接口的MTU,并且设置了DF位,所以应该会返回错误。 因此,在无法使用`-M do`的情况下,我们只能依赖于其他工具或者改变测试方法。 总结解决方案: 1. 检查ping版本,尝试使用`ping --help`查看是否有设置DF位的选项。在busybox中,可能使用`-t`选项来设置TTL,但没有设置DF位的选项。 2. 使用traceroute:`traceroute -F -n -f 1 -m 1 1.0.0.1`(但可能也不支持`-F`)。 3. 使用其他工具,如`hping3`(如果路由器支持安装): `hping3 -1 -c 1 -d 1400 --df -I ppp0 1.0.0.1` 其中,`-1`表示ICMP,`-d`指定数据部分大小,`--df`设置DF位。 4. 如果以上都不行,可以尝试在路由器上安装支持设置DF位的ping版本(如iputils-ping)或者使用其他嵌入式工具。 另外,如果只是为了验证ppp0接口的MTU设置是否生效,我们可以直接通过`ifconfig ppp0`查看MTU值,或者发送一个大于MTU的包(不带DF位)然后抓包看是否分片。 但用户的问题是如何修正命令,所以我们可以建议: - 如果是在Linux系统(非busybox)上,使用`-M do`是正确的,请检查命令输入是否正确(注意大小写)。 - 如果是在busybox环境下,则可能不支持`-M`,我们可以省略`-M do`,然后通过抓包(tcpdump)来观察是否分片,从而判断MTU设置是否生效。 具体步骤: 在路由器上运行: `ping -s 1400 -I ppp0 1.0.0.1` 同时在另一个终端抓包: `tcpdump -i ppp0 icmp -vv` 如果看到分片(有多个IP包),则说明MTU设置生效(因为包太大被分片);如果没有分片且发送成功,则说明MTU大于1400(但这不是我们设置的,所以应该会分片)。但是,如果链路上有其他设备,可能分片发生在其他设备上,所以抓包在ppp0上可以看到分片前的大包(因为ppp0的MTU是1400,所以一个1428字节的包会被分成两个包)。 然而,由于ppp0接口的MTU是1400,所以当IP包大小为1428时,在发送到ppp0接口时就会被分成两个包(一个1400,一个28+?)。所以抓包会看到两个包。 因此,我们可以这样验证:发送一个1400字节的ICMP数据(即`-s 1400`,IP包总大小1428),然后在ppp0接口抓包,如果看到两个包(一个1400字节,另一个是剩余的),则说明分片发生,即MTU设置生效。 所以,即使没有设置DF位,我们也能通过是否分片来判断MTU设置是否生效。 因此,我们给用户的建议是:去掉`-M do`,然后通过抓包来观察分片情况。 另外,注意错误信息中提示的是`-M`选项无效,所以我们可以尝试使用其他选项(如果有)。 在busybox的ping中,可能支持的选项有限。我们可以查看帮助,比如在OpenWrt路由器上,输入`ping --help`,可能会看到: `Usage: ping [OPTIONS] HOST` 选项中没有`-M`,但可能有`-f`(flood模式)或`-t`(设置TTL),但没有专门设置DF位的。 所以,最终回答: 错误原因:您使用的ping命令(可能是busybox版本)不支持`-M`选项。 解决方案: 1. 使用`ifconfig ppp0`直接查看MTU值(第一行输出中会有MTU:1400)。 2. 使用不带`-M`的ping命令,并配合tcpdump抓包观察分片情况: ```bash # 在终端1启动抓包 tcpdump -i ppp0 -nn -v icmp # 在终端2发送大包 ping -s 1400 -c 1 -I ppp0 1.0.0.1 ``` 如果MTU设置生效,抓包结果会出现两个IP包(分片)。 3. 安装完整版iputils-ping(如果路由器有包管理器): ```bash opkg update opkg install iputils-ping # 然后使用新ping命令:通常为`ping.iputils`,支持`-M do` ``` 4. 使用其他测试方法:如逐步增加包大小直到分片或失败。 注意:用户的路由器环境很可能是OpenWrt,其默认的ping是busybox的简化版。 根据以上分析,我们给出回答。 </think>您遇到的错误 `ping: invalid option -- M` 表示您使用的 `ping` 命令版本**不支持 `-M` 选项**。这个选项主要用于 Linux 系统的 `iputils-ping` 实现,而路由器系统(如 OpenWrt)通常使用精简版的 `busybox ping`,功能较为有限。以下是详细解决方案: --- ### 一、错误原因解析 1. **环境差异** - `-M do` 是 Linux 桌面版 `iputils-ping` 的专有选项(设置 **DF 位**禁止分片) - 路由器嵌入式系统(如 OpenWrt/DD-WRT)使用 `busybox ping`:**仅支持基础参数** - 可用选项可通过 `ping --help` 验证(通常只有 `-c`/`-s`/`-I` 等) 2. **命令对比** | 选项 | `iputils-ping` (Linux桌面) | `busybox ping` (路由器) | |------------|---------------------------|------------------------| | `-M do` | ✅ 设置 DF 位 | ❌ 不支持 | | `-s` | ✅ 指定包大小 | ✅ 支持 | | `-I` | ✅ 指定网口 | ✅ 支持 | --- ### 二、替代解决方案(适用于路由器) #### ▶ 方案1:通过 `-s` 间接测试 MTU(推荐) ```bash # 计算测试包大小:MTU值 - IP头(20) - ICMP头(8) ping -s 1372 -I ppp0 1.0.0.1 # MTU=1400时 => 1400-20-8=1372 ``` - **结果判断**: - ✅ 收到回复 → MTU 设置成功 - ❌ `send: Message too long` → MTU 未生效 #### ▶ 方案2:使用 `tcpdump` 抓包验证 ```bash # 后台启动抓包(监听ppp0接口) tcpdump -i ppp0 -w /tmp/mtu_test.pcap & # 发送测试包 ping -s 1372 -c 1 -I ppp0 1.0.0.1 # 停止抓包并分析 killall tcpdump tcpdump -r /tmp/mtu_test.pcap -v | grep "frag" ``` - **关键指标**: 若输出 `frag needed` 表明分片发生(MTU 过小) 无输出则 MTU 满足要求 #### ▶ 方案3:安装完整版 ping 工具(需空间) ```bash # OpenWrt 安装 iputils-ping opkg update opkg install iputils-ping # 使用完整版(通常重命名为 ping4) ping4 -s 1400 -M do -I ppp0 1.0.0.1 ``` --- ### 三、替代命令解释 ```bash # busybox ping 可用参数示例(路由器环境) ping -c 4 \ # 发送4个包 -s 1372 \ # 数据段大小(不含IP/ICMP头) -I ppp0 \ # 指定出口接口 -W 2 \ # 超时2秒 1.0.0.1 # 目标地址 ``` --- ### 四、其他验证手段 1. **直接查看接口 MTU** ```bash ifconfig ppp0 | grep MTU # 输出应包含:MTU:1400 ``` 2. **通过路由表检查** ```bash ip route show dev ppp0 | grep mtu # 输出示例:default via 10.8.0.1 dev ppp0 mtu 1400 ``` > 📌 **技术提示**: > 真实 MTU = `ping -s` 值 + 28 字节(20B IP头 + 8B ICMP头) > 例如 `-s 1372` 实际生成 1400B 的 IP 包
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值