Kotlin快速排序单元测试结果非确定性问题求助
整数数组快速排序的非确定性测试问题
我正在通过实现整数数组快速排序学习Kotlin,目前的代码实现如下:
Program类实现
enum class SortingCriterion { DESCENDING, ASCENDING } class Program( private val data: Array<Int>, private val sortingCriterion: SortingCriterion = SortingCriterion.ASCENDING ) { fun run() = sort(data.copyOf()) private fun sort(data: Array<Int>): Result { if (data.size < 2) { return Result(data) } val pivot = chooseRandomPivot() val less = data.asSequence().filter { e -> e < pivot }.toList().toIntArray().toTypedArray() val greater = data.asSequence().filter { e -> e > pivot }.toList().toIntArray().toTypedArray() return if (sortingCriterion == SortingCriterion.ASCENDING) Result(sort(less).data + pivot + sort(greater).data) else Result(sort(greater).data + pivot + sort(less).data) } private fun chooseRandomPivot() = data[data.indices.random()] }
Result类实现
为了方便断言预期结果和实际结果的相等性,我用Result类包装排序结果:
class Result(val data: Array<Int>) { override fun equals(other: Any?): Boolean { if (this === other) return true if (javaClass != other?.javaClass) return false other as Result return data.contentEquals(other.data) } override fun hashCode(): Int { return data.contentHashCode() } }
测试代码
import org.junit.jupiter.api.Assertions.* import kotlin.test.Test class ProgramTest { @Test fun sort_data_in_default_order() { val actualResult = Program(arrayOf(1, 5, 4)).run() assertEquals(Result(arrayOf(1, 4, 5)), actualResult) } @Test fun sort_data_in_ascending_order() { val actualResult = Program(arrayOf(1, 5, 4), SortingCriterion.ASCENDING).run() assertEquals(Result(arrayOf(1, 4, 5)), actualResult) } @Test fun sort_data_in_descending_order() { val actualResult = Program(arrayOf(1, 5, 4), SortingCriterion.DESCENDING).run() assertEquals(Result(arrayOf(5, 4, 1)), actualResult) } }
问题现象
测试结果具有非确定性:有时所有测试都通过,但偶尔会有测试失败。某次失败的错误信息如下:
expected: <Result@87a1> but was: <Result@10709e> Expected :Result@87a1 Actual :Result@10709e <Click to see difference> org.opentest4j.AssertionFailedError: expected: <Result@87a1> but was: <Result@10709e> at app//org.junit.jupiter.api.AssertionUtils.fail(AssertionUtils.java:55) at app//org.junit.jupiter.api.AssertionUtils.failNotEqual(AssertionUtils.java:62)
请问我的实现是否存在错误?
内容的提问来源于stack exchange,提问作者Uvuvwevwevwevwe
相关产品推荐
相关产品推荐

