appium笔记八:用例设计层

用例层好像没什么说的,根据自己app设计用例了,值得注意一点是driver对象必须时唯一的,因为很多地方都会用到driver对象,所以创建远程连接的时候要注意了

这里创建连接作为一个类,另外也创建一个基础测试类,其他所有用例类都继承这个基础类,方便操作和管理

上代码:.

driver类

package com.testcase;

import com.appium.api.Log;

import org.openqa.selenium.remote.DesiredCapabilities;

import java.io.File;
import java.net.URL;
import java.util.concurrent.TimeUnit;

import io.appium.java_client.android.AndroidDriver;

/**
 * Created by kingwit on 2017/9/13 0013.
 * 创建唯一的driver
 */

public class Utils {

    public static AndroidDriver<?> driver;


    public void creatDriver() {
        File classpathRoot = new File(System.getProperty("user.dir"));
        //app的目录
        File appDir = new File(classpathRoot, "/apps");
        //app的名字,对应你apps目录下的文件
       //  File app = new File(appDir, "36f2a88f08fae8dafff1367e2fe73fb8.apk");

        //创建Capabilities
        DesiredCapabilities dc = new DesiredCapabilities();

        //设置app的
      //  dc.setCapability("app", app.getAbsolutePath());
        //设置要调试的模拟器的名字
        dc.setCapability("deviceName", "015d8537ca6120e9");
        //support Chinese支持中文输入
        dc.setCapability("unicodeKeyboard", "True");

        //重置输入法为系统默认
        dc.setCapability("resetKeyboard", "True");

        //设置模拟器的系统版本
        dc.setCapability("platformVersion", "7.1.2");

        dc.setCapability("noReset", true); //不需要再次安装

        //no need sign 安装时不对apk进行重签名,设置很有必要,否则有的apk在重签名之后无法正常使用
        dc.setCapability("noSign", "True");
        //设置app的包名
        dc.setCapability("appPackage", "o--------");
        dc.setCapability("sessionOverride", true);
        //设置app的启动activity
        dc.setCapability("appActivity", "org.stagex.danmaku.activity.SplashActivity");

        //启动driver
        try {
            driver = new AndroidDriver<>(new URL("http://127.0.0.1:4723/wd/hub"), dc);
            Log.info("创建driver对象成功...");
        } catch (Exception e) {
            Log.error("创建driver对象失败...");
            e.printStackTrace();
        }
        driver.manage().timeouts().implicitlyWait(15, TimeUnit.SECONDS);
        Log.info("App is launched!....");
    }

}

基础测试类:

package com.testcase;

import com.appium.api.Log;
import com.basepage.object.ChannelPage;
import com.basepage.object.HomePage;
import com.basepage.object.LoginPage;
import com.basepage.object.MyPage;
import com.basepage.object.PlayerPage;
import com.basepage.object.UtilsPublicPage;
import com.datas.api.ActivityPaser;

import org.testng.annotations.AfterClass;
import org.testng.annotations.AfterSuite;
import org.testng.annotations.BeforeSuite;

import static com.appium.api.ThreadSleepMethod.threadSleep;
import static com.basepage.object.HomePage.PagePath;

/**
 * Created by kingwit on 2017/9/18 0018.
 * 测试父类,测试子类继承该类提供初始化实例
 */

public class BaseTestCase extends Utils{

    static HomePage homePage ;
    static PlayerPage playerPage ;
    static MyPage myPage ;
    static ChannelPage channelPage;
    static LoginPage loginPage;
    static UtilsPublicPage up;

    @BeforeSuite
    public void beforeSuit(){
        creatDriver();
        threadSleep(10000);
        Log.info("初始化页面实例...");
        init();
        beforeClassTest();
    }


    @AfterSuite
    public  void tearDown() throws Exception {
        //测试完毕,关闭driver,不关闭将会导致会话还存在,下次启动就会报错
        Log.info("测试完成...退出app");
        driver.quit();
    }

    //初始化页面实例
    private void init(){
        playerPage = PlayerPage.getInstance(driver);
        homePage = HomePage.getInstance(driver);
        myPage = MyPage.getInstance(driver);
        channelPage = ChannelPage.getInstance(driver);
        loginPage = LoginPage.getInstance(driver);
        up = UtilsPublicPage.getInstance(driver);
    }

    /**
     * 每次测试结束后需要回到home主页
     */
    @AfterClass
    public void afterClass(){
        threadSleep(2000);
        for(int i=0; i<4; i++) {
            if (!up.getCurrentActivity().equals(ActivityPaser.HomePageActivty)) {
                Log.info("当前页面不在主页,回到主页....");
                homePage.goBack();
                if (playerPage.isTargetAppear("exitPlay")){
                    playerPage.clickByButtonName("exitPlay");
                }
            }else{
                homePage.goToAppoint(PagePath,1,"频道");
                break;
            }
        }
    }

    // 开始测试前关闭广告
    private void beforeClassTest(){
        Log.info("判断当前主页");
        try{
            if(up.getCurrentActivity().equals(ActivityPaser.HomePageActivty)) {
                Log.info("当前页面为home主页");
                homePage.closeAD();
            }
        }catch (Exception e){
            //加上点击一下频道按钮
            Log.info("不在home主页");
            threadSleep(2000);
        }
    }
}

给出一个具体测试用例:

package com.testcase;

import com.appium.api.Log;
import com.datas.api.ActivityPaser;

import org.assertj.core.api.Assertions;
import org.openqa.selenium.WebElement;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;

import java.util.List;

import static com.appium.api.ThreadSleepMethod.threadSleep;
import static org.assertj.core.api.Assertions.assertThat;

/**
 * Created by kingwit on 2017/9/18 0018.
 * 搜索测试集
 */

public class SearchTestCase extends BaseTestCase{

    @BeforeClass
    public void beforeClass(){
    }

    /*
    用于重复操作
     */
    private void  inputSearch(){
        homePage.search("吴京");
    }


    @Test(description = "搜索测试:有搜索结果")
    public void searchResult()  {
        Log.info("搜索测试开始...");
        inputSearch();
        List<WebElement> list = homePage.getSearchResult("search_title_name");
        assertThat(list.get(0).getText()).contains("吴京");
    }

    @Test(description = "搜索测试:搜索结果跳转播放")
    public void playSearchResult()  {
        Log.info("测试搜索结果跳转播放...");
        threadSleep(2000);
        inputSearch();
        List<WebElement> list = homePage.getSearchResult("search_title_name");
        list.get(0).click();
        assertThat(playerPage.isPlayOrNot());
        homePage.goBack();

    }

    @Test(description = "搜索测试:删除输入内容")
    public void deleteInputText()  {
        Log.info("测试删除输入内容...");
        inputSearch();
        Log.info("删除前内容是:"+homePage.getEditText());
        homePage.deleteEditText();
        Log.info("删除后内容是:"+homePage.getEditText());
        assertThat(homePage.getEditText()).contains("输入频道");
    }

    @Test(description = "搜索测试:云币领取")
    public void getCooudCoin()  {
        threadSleep(5000);
    }


    @Test(description = "搜索测试:无搜索结果")
    public void noSearchResultTest()  {
        Log.info("搜索测试开始...");
        homePage.search("uuuuu");
        threadSleep(2000);
        List<WebElement> list = homePage.getSearchResult("no_search_result");
       // List<WebElement> list = (List<WebElement>) driver.findElements(By.className("android.widget.TextView"));
        Log.info("list 长度为 "+list.size());
        assertThat(list.get(1).getText()).contains("没有搜到内容");
    }

    @Test(description = "搜索测试:热门推荐")
    public void hotSearchTest()  {
        Boolean flag = false;
        Log.info("热门搜索测试开始...");
        homePage.search("");
        List<WebElement> list = homePage.getSearchResult("hot_search");
        for(int i=0; i<list.size(); i++){
            if(list.get(i).getText().contains("那年花开")){
                flag = true;
            }
        }
        Assertions.assertThat(flag);
    }


    @Test(description = "搜索测试:热门推荐跳转播放")
    public void playHotRecommended()  {
        Log.info("测试热门推荐跳转播放...");
        homePage.search("");
        List<WebElement> list = homePage.getSearchResult("hot_search");
        for(int i=0; i<list.size(); i++){
            if(list.get(i).getText().contains("猎场")){
               list.get(i).click();
                Log.info("找到热门搜索相关元素");
                break;
            }else{
                Log.info("没有找到热门搜索相关元素");
            }

        }
        threadSleep(3000);
        List<WebElement> li = homePage.getSearchResult("search_title_name");
        li.get(0).click();
        assertThat(playerPage.isPlayOrNot());
        homePage.goBack();
    }

    @Test(description = "搜索测试:搜索历史")
    public void searchHistory()  {
        Log.info("搜索历史测试开始...");
        homePage.search("洪金宝");
        threadSleep(2000);
        List<WebElement> list = homePage.getSearchResult("search_title_name");
        list.get(0).click();
        if(up.getCurrentActivity().equals(ActivityPaser.PlayPageActivty)){
            Log.info("跳到播放页成功...播放15s");
            threadSleep(15000);
            homePage.goBack();
            Log.info("返回搜索页");
        }else {
            Log.info("跳到播放页失败");
        }
        homePage.cancelSearch();
        homePage.search("");
        List<WebElement> ls = homePage.getSearchResult("hot_search");
        assertThat(ls.get(0).getText()).contains("洪金宝");
    }

    @Test(description = "搜索测试:搜索历史跳转播放",dependsOnMethods = { "searchHistory" })
    public void playSearchHistory()  {
        homePage.search("");
        List<WebElement> list = homePage.getSearchResult("hot_search");
        if(list.size()<1){
            Log.info("找不到搜索历史,请检查");
            assertThat(true).isFalse();
        }else{
            list.get(0).click();
            List<WebElement> li = homePage.getSearchResult("search_title_name");
            li.get(0).click();
            assertThat(playerPage.isPlayOrNot());
        }
        homePage.goBack();
    }

    @Test(description = "搜索测试:删除搜索历史",dependsOnMethods = { "playSearchHistory" })
    public void deleteHistory()  {
        Boolean flag = true;
        homePage.search("");
        homePage.deleteHistory();
        if(homePage.isTargetAppear("dele_history")){
            flag = false;
        }
        assertThat(flag);
    }

    @AfterClass
    public void exitSearch(){
        homePage.cancelSearch();
    }

}


下一节,测试报告模板


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Appium自动化测试用例可以通过使用Appium Inspector进行录制和生成。首先,需要配置待测应用并连接移动设备成功后,在Appium Inspector中点击录制按钮开始录制用例。在录制过程中,可以通过点击操作选中元素,并进行相应的操作,如点击、输入等。录制完成后,可以生成用例脚本。\[3\] 生成的用例脚本可以包含以下内容: - 使用driver.find_element方法找到元素,并使用相应的操作方法进行操作,如点击、输入等。例如:el1 = driver.find_element(by=AppiumBy.ACCESSIBILITY_ID, value="OS") el1.click() - 可以对生成的用例脚本进行优化,添加capability信息、初始化webdriver、添加setup和teardown、添加隐式等待和noReset属性等,以增强用例的稳定性。\[3\] 此外,还可以添加断言来验证测试结果的准确性。通过添加断言,可以判断测试过程中的期望结果是否与实际结果一致,从而判断测试用例是否通过。\[3\] 总结来说,Appium自动化测试用例可以通过使用Appium Inspector进行录制和生成,然后可以对生成的用例脚本进行优化和添加断言来增强用例的稳定性和准确性。 #### 引用[.reference_title] - *1* *2* *3* [【App自动化测试】(三)使用Appium进行自动化用例录制](https://blog.csdn.net/gjj920318/article/details/127996223)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值