搜尋此網誌

顯示具有 Java 標籤的文章。 顯示所有文章
顯示具有 Java 標籤的文章。 顯示所有文章

2014年2月10日

Android UIAutormator - First touch

1. Control and switch between multiple activities of a single app.
2. Control an switch between multiple apps.
3. Combine with API for result checking?
4. User gesture coverage (Single tap, Double tap, Long press, Swipe, Scroll, etc).
5. UI component travel

Study:
3. Sample:
     b. Calculator:
     g. 


Step:
1. Create a Java project.
2. Add Junit lib.
3. Add android.jar & uiautomator.jar.
4. Coding.
5. <android-sdk>/tools/android create uitest-project -n <project_name> -t <AVD_ID> -p <project_path> (AVD_ID 透過 android list 取得)
6. Edit build.xml -> line2 ("help" -> "build").
7. build.xml -> ant build
8. adb push xxx.jar /data/local/tmp/
9. adb shell uiautomator runtest xxx.jar -c <Package_name>.<Class_Name>.

2014年2月7日

Java + Android + Sikuli + UIAutomator = Test automation

Project page: https://code.google.com/p/sikuli-api/

Eclipse:
  • sikuli-api-1.0.2-standalone.jar
  • slf4j-nop-1.7.5.jar
  • log4j-over-slf4j-1.7.5.jar

Example: (Java project)

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.lang.annotation.Target;

import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.WindowConstants;

import org.sikuli.api.DesktopScreenRegion;
import org.sikuli.api.ImageTarget;
import org.sikuli.api.ScreenRegion;
import org.sikuli.api.visual.Canvas;
import org.sikuli.api.visual.DesktopCanvas;


public class SikuliTest {

    private static BufferedImage bi;
    private static JFrame frame;

    public static void main(String[] args) throws Exception {
        try {           
            Util.execCMD("adb push WiFi_UItest.jar /data/local/tmp");
            Util.execCMD("adb shell uiautomator runtest WiFi_UItest.jar -e CheckId 1 -c s2.wifi.TurnOn -c s2.wifi.CheckResult -s");
            Util.execCMD("adb pull /mnt/sdcard/Pictures/test_TurnOn.png C:\\tmp");
           
            loadImage();

            SwingUtilities.invokeLater(new Runnable() {
                @Override
                public void run() {
                    createAndShowGUI();
                }
            });
           
            ScreenRegion s = new DesktopScreenRegion();
            Thread.sleep(3000);
            ScreenRegion result = s.find(new ImageTarget(new File("c:\\tmp\\383.jpg")));
            // System.out.println("Score: " + result.getScore());
            // System.out.println("State: " + result.getState());
           
            // Construct a Canvas object of the type DesktopCanvas
            Canvas canvas = new DesktopCanvas();
            // Add a box around a screen region 'r'
            canvas.addBox(result);
            // Add a label on the screen region r
            canvas.addLabel(result, "WE FOUND IT!!");
            // Display the canvas for 3 seconds
            canvas.display(3);
           
            // frame.dispose();
           
        } catch (IOException e) {
            // handle exception
        }
    }

    private static void loadImage() throws IOException {       
        bi = ImageIO.read(new File("C:\\tmp\\test_TurnOn.png"));
    }

    private static void createAndShowGUI() {
        frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        final JPanel panel = new JPanel() {
            @Override
            protected void paintComponent(Graphics g) {
                Graphics g2 = g.create();
                g2.drawImage(bi, 0, 0, getWidth(), getHeight(), null);
                g2.dispose();
            }

            @Override
            public Dimension getPreferredSize() {
                return new Dimension(bi.getWidth()/3, bi.getHeight()/3);
            }
        };

        frame.add(panel);
        frame.pack();
        frame.setLocationRelativeTo(null);
        // frame.setLocation(500, 20);
        frame.setVisible(true);
    }
}

Image comparison

2.       Sikuli
3.       OpenCV
4.       http://www.vlfeat.org/
5.    ImageMagic (http://positon.org/compare-diff-between-two-images)

2012年10月31日

JChart2D Zoomable char

package com.qci.jchart2ddemo;

import info.monitorenter.gui.chart.Chart2D;
import info.monitorenter.gui.chart.ITrace2D;
import info.monitorenter.gui.chart.ZoomableChart;
import info.monitorenter.gui.chart.pointpainters.PointPainterDisc;
import info.monitorenter.gui.chart.traces.Trace2DSimple;
import info.monitorenter.gui.chart.views.ChartPanel;

import java.awt.BasicStroke;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.Random;

import javax.swing.JButton;
import javax.swing.JFrame;

public class ZoomTest extends JFrame {

     private static final long serialVersionUID = -2249660781499017221L;

     class ZoomAllAdapter implements ActionListener {

         private ZoomableChart m_zoomableChart;

         public ZoomAllAdapter(final ZoomableChart chart) {
              this.m_zoomableChart = chart;
         }

         public void actionPerformed(final ActionEvent event) {
              this.m_zoomableChart.zoomAll();
         }
     }

     public static void main(final String[] args) {

         ZoomTest zoomTest = new ZoomTest();
         // Show the frame
         zoomTest.setSize(640, 480);
         zoomTest.setVisible(true);

     }

     public ZoomTest() {

         super("ZoomTest");

         Container c = this.getContentPane();
         c.setLayout(new BorderLayout());

         // Create a chart
         ZoomableChart chart = new ZoomableChart();

         ITrace2D trace = new Trace2DSimple();
         // Add the trace to the chart. This has to be done before adding points (deadlock prevention):
         chart.addTrace(trace);   
         // Add all points, as it is static:
         Random random = new Random();
         for(int i=100;i>=0;i--){
           trace.addPoint(i,random.nextDouble()*10.0+i);
         }

         chart.setToolTipType(Chart2D.ToolTipType.VALUE_SNAP_TO_TRACEPOINTS);
         // chart.setPointHighlighter(new PointPainterDisc(8));

         // Add chart to the pane
         c.add(new ChartPanel(chart));

         // Create the zoomAll button
         JButton zoomAllButton = new JButton("Zoom All");
         zoomAllButton.addActionListener(new ZoomAllAdapter(chart));

         // Add zoomAll button to the pane
         c.add(zoomAllButton, BorderLayout.NORTH);

         // Enable the termination button:
         this.addWindowListener(new WindowAdapter() {

              @Override
              public void windowClosing(final WindowEvent e) {
                  System.exit(0);
              }
         });

     }
}

2011年10月26日

很棒的 tutorial & sample code 網站

包含 Java / Android / C# / C++ / …
陸續更新
大陸很多blog或論壇都有很豐富的資料唷,不過不見得有RSS,只能用Google大神了

Android / Java
Python
  • http://wiki.pastwind.org/home/python-cheng-shi-yu-yan

C# Design pattern:
  • http://www.dotnetfunda.com/articles/article889-design-pattern-implementation-using-csharp.aspx
  • http://www.dofactory.com/Patterns/Patterns.aspx
  • http://dotnetframework.blogspot.com/2005/03/c23design-pattern.html
  • http://en.csharp-online.net/CSharp_Design_Patterns_Made_Simple

[轉] Execute a system command / 各種語言呼叫系統命令的方法

http://rosettacode.org/wiki/Execute_a_system_command