React

代替人工进行功能测试

单元测试

代码示例:

// src/App.jsx

import React from "react";
import {createRoot} from "react-dom/client";
import App from "./unit_testing/App";

createRoot(document.getElementById('root')).render(<App/>)
// src/unit_testing/App.jsx

import React, {useState} from "react";

export default function App() {
    const [list, setList] = useState(['aaa', 'bbb', 'ccc'])
    const [text, setText] = useState('')

    return (
        <div>
            <h1>ToDoList</h1>
            <input type="text" onChange={evt => {
                setText(evt.target.value)
            }}/>
            <button className={'add'} onClick={() => {
                setList([...list, text])
            }}>add
            </button>
            <ul>
                {
                    list.map((item, index) => <li key={item}>
                        {item}
                        <button className={'del'} onClick={() => {
                            let newList = [...list]
                            newList.splice(index, 1)
                            setList(newList)
                        }}>del
                        </button>
                    </li>)
                }
            </ul>
        </div>
    )
}
// src/unit_testing/test/App-test.test.js

import ShallowRender from 'react-test-renderer/shallow'  // 浅渲染(速度快,但不会测试子组件,仅测试一层)
import App from '../App'
// import ReactTestUtil from 'react-dom/test-utils'  // 模拟点击

describe('App-test', () => {
    it('h1标签', () => {
        const render = new ShallowRender()
        render.render(<App/>)
        // console.log(render.getRenderOutput().props.children[0].type)  // 根据终端提示
        expect(render.getRenderOutput().props.children[0].type).toBe('h1')  // 期望(断言)指定的测试的结果为h1标签
        expect(render.getRenderOutput().props.children[0].props.children).toBe('ToDoList')
    })
    // it('删除功能', () => {
    //     const app = ReactTestUtil.renderIntoDocument(<App/>)  // 渲染成真实DOM来模拟点击
    //     let todoitems = ReactTestUtil.scryRenderedDOMComponentsWithTag(app, 'li')
    //     let detelteButton = todoitems[0].querySelector('button')
    //     ReactTestUtil.Simulate.click(detelteButton)  // 点击删除按钮
    //     let todoitemsAfterClick = ReactTestUtil.scryRenderedDOMComponentsWithTag(app, 'li')
    //     expect(todoitems.length - 1).toBe(todoitemsAfterClick.length)  // 前后比对
    // })
    // it('添加功能', () => {
    //     const utils = ReactTestUtil.renderIntoDocument(<App/>)
    //     let view = ReactTestUtil.scryRenderedDOMComponentsWithTag(utils, 'li')
    //     let addInput = ReactTestUtil.scryRenderedDOMComponentsWithTag(utils, 'input')
    //     addInput.value = 'HQSY'  // 输入指定值
    //     let addButton = ReactTestUtil.findRenderedDOMComponentWithClass(app, 'add')
    //     ReactTestUtil.Simulate.click(addButton)  // 点击添加按钮
    //     let todoitemsAfterClick = ReactTestUtil.scryRenderedDOMComponentsWithTag(app, 'li')
    //     expect(todoitemsAfterClick.length).toBe(todoitems.length + 1)  // 前后比对
    // })
})

第三方

代码示例:

// src/unit_testing/test/App-enzyme.test.js

import App from "../App";
import Enzyme, {shallow, mount} from 'enzyme'  // 需要适配器的支持
import adapater from '@wojtekmaj/enzyme-adapter-react-17'

Enzyme.configure({adapater: new adpater()})  // 适配器是必须的,否则报错

describe('App-test', () => {
    it('h1标签', () => {
        let app = shallow(<App/>)  // 渲染成虚拟DOM且是浅层次的渲染
        expect(app.find('h1').text()).toEqual('ToDoList')
    })
    it('删除功能', () => {
        let app = mount(<App/>)  // 渲染成真实DOM
        let todolength = app.find('li').length
        app.find('button.del').at(0).simulate('click')  // del对应类名,第一个位置模拟点击
        expect(app.find('li').length).toEqual(todolength - 1)
    })
    it('添加功能', () => {
        let app = mount(<App/>)
        let todolength = app.find('li').length
        let addInput = app.find('input')
        addInput.value = 'HQSY'
        app.find('add').simulate('click')
        expect(app.find('li').length).toEqual(todolength + 1)
    })
})