Python+MoneyRunner+Java實現計算器功能自動化

春節回來後,一直想寫點腳本,剛好在項目測試中遇到一個小小的需求:就是要驗證輸入法中計算器的邏輯運算功能
針對這個需求,初步是想利用模擬按鍵點擊的方法,來進行點擊按鍵,按鍵佈局可以提前算好放置到一個字典中,所以就選用了MonkeyRunner這個測試框架,那必然腳本就要使用Python了,下面是具體的步驟,以及在腳本編寫中遇到的一些問題

一.實現模擬點擊已經準備好的需要驗證的算式

# coding:utf-8
# 模擬點擊計算器進行功能迴歸測試
from com.android.monkeyrunner import MonkeyRunner,MonkeyDevice,MonkeyImage
import random
import time
import string
import sys
import os
from random import randint

print 'start:calculate regression test '
splitTime = 0.01
basewidth = 720
baseheight = 1280
#deviceList = []

def ClickIme():
    keyMap = {
        '7': [98,1479],    '8': [295,1479],    '9': [492,1479],    '+': [688,1479],
        'delte': [885,1479],    '4': [98,1605],    '5': [295,1605],    '6': [492,1605],
        '-': [688,1605],    '()': [885,1605],    '1': [98,1731],    '2': [295,1731],
        '3': [492,1731],    'x': [688,1731],    'pop': [885,1731],    '0': [98, 1857],
        '00': [295, 1857],    '.': [492, 1857],    '÷': [688, 1857],    '=': [885, 1857]
    };

    #喚醒屏幕
    device=MonkeyRunner.waitForConnection()
    device.wake()
    device.startActivity("com.example.calctest/com.example.calctest.MainActivity")
    print "start"
    device.touch(300,200,"DOWN_AND_UP")
    #MonkeyRunner.sleep(2)
    dw = device.getProperty("display.width")
    dy = device.getProperty("display.height")
    screenWidth  =  int(str(dw))
    screenHeight =  int(str(dy))
    MonkeyRunner.sleep(1)
    #device.touch(screenWidth/2,screenHeight/2,"DOWN_AND_UP")
    #MonkeyRunner.sleep(1)
    device.touch(50,70 + (screenHeight-(550*screenWidth/basewidth)),"DOWN_AND_UP")
    MonkeyRunner.sleep(2)
    device.touch(1000,600+(screenHeight-(550*screenWidth/basewidth)),"DOWN_AND_UP")
    MonkeyRunner.sleep(2)
    fp = open("\\calctest.txt", "rb").readlines()
    for line in fp:
        items = line.split()
        for char in items[0]:
            if char in keyMap:
                pos = keyMap[char]
                device.touch(pos[0],pos[1],"DOWN_AND_UP")
                MonkeyRunner.sleep(0.05)
        device.touch(422,1300,"DOWN_AND_UP")
        MonkeyRunner.sleep(0.05)

if __name__ == '__main__':
    ClickIme()

二.在Edittext中監聽獲取結果,並打印到sdcard/log
編寫一個apk,用來監聽edittext結果區域的變化,並記錄下來,關鍵代碼片段

// 初始化控件,添加監聽
    private void initView() {
        edite = (EditText) findViewById(R.id.editText1);
        edite.addTextChangedListener(new TextWatcher() {

            @Override
            public void afterTextChanged(Editable s) {
                String content = s.toString();
                if (content != null && content.length() > 0) {
                    saveToFile(content);
                    s.clear();
                }

            }

            @Override
            public void beforeTextChanged(CharSequence s, int start, int count,
                    int after) {
                // TODO Auto-generated method stub

            }

            @Override
            public void onTextChanged(CharSequence s, int start, int before,
                    int count) {
                // TODO Auto-generated method stub

            }
        });
    }

    // 保存結果到文件
    private void saveToFile(String content) {

        String filePath = Environment.getExternalStorageDirectory().toString()
                + "/log/log.txt";
        File file = new File(filePath);
        if (!file.exists()) {
            file.getParentFile().mkdirs();
            // file.mkdirs();
        }
        PrintStream fout = null;
        try {
            fout = new PrintStream(new FileOutputStream(file, true));
            fout.println(content);
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } finally {
            if (fout != null) {
                try {
                    fout.close();
                } catch (Exception e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }
    }

三. 比較log中的結果與期望結果對比

# coding:utf-8
# 計算器結果比對
f1 = open("log.txt",'r')
f2 = open("exec.txt",'r')
f3 = open("final_result.txt",'w')
for (line1,line2) in zip(f1,f2):
    if line1 == line2:
        continue
    else:
        f3.write("\t".join(line1.split()) + "\tfailed\n")           
f1.close()
f2.close()
f3.close()

經過上面三個過程,就可以完成剛開始說的需求了,由於自己之前寫腳本少些,所以事先起來中間遇到不少問題,不過通過跟相關同學的徐誒請教,最終得以成形,個人感覺還是要多做,並加以堅持就可以搞定.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章