AI based test generation
Cheers I am at the moment experimenting with getting an AI to write test methods for me. The current results are a mixture of simple and advanced :-) To get started I wanted to write tests for a class that does not go to the web, file or UI, and doing something which is standard, but with no method comments. So the experiments is for the class "Heap". I have not really been successful, but now I have what I see as a breakthrough, and wanted to know if anyone else had the same experience? -- Kasper Here is an example Heap >> upHeap: anIndex "Check the heap upwards for correctness starting at anIndex. Everything below anIndex is ok." | value k kDiv2 tmp | anIndex = 0 ifTrue:[^self]. k := anIndex. value := array at: anIndex. [ (k > 1) and:[self sorts: value before: (tmp := array at: (kDiv2 := k bitShift: -1))] ] whileTrue:[ array at: k put: tmp. self updateObjectIndex: k. k := kDiv2]. array at: k put: value. self updateObjectIndex: k And the test build by AI is this: testUpHeap | arr | "Test upHeap: for index 0, should do nothing" refHeap upHeap: 0. self assert: true. "No error, no change expected" "Set up min-heap sort block" refHeap sortBlock: [ :a :b | a <= b ]. "Test upHeap:1 on single element, no change" arr := Array new: 10. arr at: 1 put: 5. refHeap instVarAt: 1 put: arr. refHeap instVarAt: 2 put: 1. refHeap upHeap: 1. self assert: ((refHeap instVarAt: 1) at: 1) equals: 5. "Test upHeap:2 with swap needed (smaller child)" arr := Array new: 10. arr at: 1 put: 3. arr at: 2 put: 1. refHeap instVarAt: 1 put: arr. refHeap instVarAt: 2 put: 2. refHeap upHeap: 2. self assert: ((refHeap instVarAt: 1) at: 1) equals: 1. self assert: ((refHeap instVarAt: 1) at: 2) equals: 3. "Test upHeap:2 with no swap (larger child)" arr := Array new: 10. arr at: 1 put: 3. arr at: 2 put: 4. refHeap instVarAt: 1 put: arr. refHeap instVarAt: 2 put: 2. refHeap upHeap: 2. self assert: ((refHeap instVarAt: 1) at: 1) equals: 3. self assert: ((refHeap instVarAt: 1) at: 2) equals: 4. "Test upHeap:3 with one swap to root" arr := Array new: 10. arr at: 1 put: 3. arr at: 2 put: 4. arr at: 3 put: 2. refHeap instVarAt: 1 put: arr. refHeap instVarAt: 2 put: 3. refHeap upHeap: 3. self assert: ((refHeap instVarAt: 1) at: 1) equals: 2. self assert: ((refHeap instVarAt: 1) at: 2) equals: 4. self assert: ((refHeap instVarAt: 1) at: 3 )equals: 3. "Test upHeap:4 with multiple swaps" arr := Array new: 10. arr at: 1 put: 1. arr at: 2 put: 3. arr at: 3 put: 2. arr at: 4 put: 0. refHeap instVarAt: 1 put: arr. refHeap instVarAt: 2 put: 4. refHeap upHeap: 4. self assert: ((refHeap instVarAt: 1) at: 1) equals: 0. self assert: ((refHeap instVarAt: 1) at: 2) equals: 1. self assert: ((refHeap instVarAt: 1) at: 3) equals: 2. self assert: ((refHeap instVarAt: 1) at: 4 )equals: 3. And the input to make it doit is AIATest04 new build: Heap >> #upHeap:: I have added a tool call that allows Grok to call and execute Pharo code, so to produce the test, it has executed these calls: ApiToolExpression: Heap compileAllFrom: 'Collections-Sequenceable'. Heap methods select: [:m | m selector = #upHeap:]. Heap instVarNames ApiToolExpression: Heap instVarNames ApiToolExpression: Heap >> #add: sourceCode ApiToolExpression: (Heap >> #add:) sourceCode ApiToolExpression: (Heap >> #reSort) sourceCode ApiToolExpression: Heap new instVarNamed: #indexUpdateBlock
participants (1)
-
Kasper Osterbye